BZOJ 2956 模积和

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\n",(ans-ans4+Mod)%Mod);
58 }

 

posted @ 2018-01-16 19:11  Z-Y-Y-S  阅读(233)  评论(0编辑  收藏  举报