Description
求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j。
Input
第一行两个数n,m。
Output
一个整数表示答案mod 19940417的值
Sample Input
3 4
Sample Output
1
样例说明
答案为(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod 2) * (4 mod 3) + (3 mod 2) * (4 mod 4) + (3 mod 3) * (4 mod 1) + (3 mod 3) * (4 mod 2) + (3 mod 3) * (4 mod 4) = 1
数据规模和约定
对于100%的数据n,m<=10^9。
原式=∑∑(n-[n/i]*i)(m-[m/j]*j)
=∑∑nm-[n/i]*i*m-[m/j]*j*n+[n/i]*[m/j]*i*j
=n*n*m*m-m*m∑[n/i]*i-n*n∑[m/j]*j+∑[n/i]*i∑[m/j]*j
发现很多n/i的值是相同的,把相同的n/i分在一块算,这样只有√n块
因为i!=j
所以ans要减去∑(n-[n/i]*i)(m-[m/i]*i)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 typedef long long lol; 8 lol n,m,pos,ans,ans1,ans2,ans3,ans4,ans5,ans6,ans7,Mod=19940417; 9 lol inv=3323403; 10 lol cal1(lol y,lol x) 11 { 12 return ((y+x)*(y-x+1)/2)%Mod; 13 } 14 lol cal2(lol y,lol x) 15 {x--; 16 lol zyys1=(2*y+1)*(y+1)%Mod*y%Mod*inv%Mod; 17 lol zyys2=(2*x+1)*(x+1)%Mod*x%Mod*inv%Mod; 18 return (zyys1-zyys2+Mod)%Mod; 19 } 20 int main() 21 {lol i; 22 cin>>n>>m; 23 if (n>m) swap(n,m); 24 ans=n*m%Mod; 25 ans=(ans*ans)%Mod; 26 pos=0;ans1=0; 27 for (i=1;i<=n;i=pos+1) 28 { 29 pos=n/(n/i); 30 ans1+=cal1(pos,i)*(n/i)%Mod; 31 ans1%=Mod; 32 } 33 ans3=ans1; 34 ans1=(ans1*m)%Mod;ans1=(ans1*m)%Mod; 35 pos=0;ans2=0; 36 for (i=1;i<=m;i=pos+1) 37 { 38 pos=m/(m/i); 39 ans2+=cal1(pos,i)*(m/i)%Mod; 40 ans2%=Mod; 41 } 42 ans3=(ans3*ans2)%Mod; 43 ans2=(ans2*n)%Mod;ans2=(ans2*n)%Mod; 44 ans=(((ans-ans1+Mod)%Mod-ans2+Mod)%Mod+ans3)%Mod; 45 46 pos=0;ans4=0;ans5=0;ans6=0;ans7=0; 47 for (i=1;i<=n;i=pos+1) 48 { 49 pos=min(n/(n/i),m/(m/i)); 50 ans7+=(((n/i)*(m/i))%Mod)*cal2(pos,i)%Mod;ans7%=Mod; 51 ans5+=(n/i)*m%Mod*cal1(pos,i)%Mod;ans5%=Mod; 52 ans6+=(m/i)*n%Mod*cal1(pos,i)%Mod;ans6%=Mod; 53 } 54 ans4=((n*n%Mod)*m%Mod-ans5+Mod)%Mod; 55 ans4=(ans4-ans6+Mod)%Mod; 56 ans4=(ans4+ans7)%Mod; 57 printf("%lld ",(ans-ans4+Mod)%Mod); 58 }