數學題,無背景
給出正整數n和k,計算g(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的餘數。例如g(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29
輸入格式:
兩個整數n k
輸出格式:
答案輸入樣例#1:
10 5輸出樣例#1:
2930%: n,k <= 1000
60%: n,k <= 10^6
100% n,k <= 10^9
找規律並證明可知:
$也就是說兩個相鄰的自然數,若被k除的商相同,則被k取模後的兩個數相差-q。
所以,只要找出乙個區間[i,j],使得k/i=k/(i+1)=...=k/j,即可用等差數列公式求出k mod i + k mod (i+1) + ... + k mod j。
這個任務就是:解方程[k/x]=p。
可以輕易得到px<=k
對於每乙個i,令p=[k/i], q=k mod i,j=min(n,k/p)。
根據等差數列公式得到k mod i + ... + k mod j = q*(j-i+1)-(j-i+1)*(j-i)/2*p。
#include#include#include#include#include#define lli long long intusing namespace std;
void read(lli &n)
while(c>='0'&&c<='9')
x=x*10+(c-48),c=getchar();
flag==1?n=-x:n=x;
} lli ans=0,p,q,n,k;
int main()
printf("%lld",ans);
return 0;
}
P2261 CQOI2007 餘數求和
數學題,無背景 給出正整數n和k,計算g n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除以i的餘數。例如g 10,5 5 mod 1 5 mod 2 5 mod 3 5 mod 4 5 mod 5 5 mod 10 0 1 2 1 0 5 5 ...
P2261 CQOI2007 餘數求和
我是題面 題意還是很清晰,很容易理解 1e9範圍明顯不能暴力,除非你能把常數優化到 frac1 但我實在想象不到用了這麼多取模怎麼把常數優化下去 我們可以把 k i 變成 k k i i 整除 那麼總的和也就從 sum k i 變成了 sum n k k i i 又可以轉化為 nk sum n k ...
P2261 CQOI2007 餘數求和
這道題看上去很簡單,暴力隨便打,30分拿到手。但是顯然你拿30分你就炸了。我們開始考慮優化。發現每乙個 都是風馬牛不相及的,我們考慮轉換。可以發現取膜的性質 a mod b a b times lfloor frac rfloor 然後這個答案就可以轉換為 sum rfloor 用乘法分配律可以把 ...