BZOJ2956: 模積和
$n<=1e9$,$m<=1e9$,求$\sum_{i=1}^{n}\sum_{j=1}^{m}[i\neq j](n \ \ mod \ \ i)(m \ \ mod \ \ j)$。mod 19940417。
好家夥,拆他!先不理$[i \neq j]$。
$\sum_{i=1}^{n}\sum_{j=1}^{m}[i\neq j](n \ \ mod \ \ i)(m \ \ mod \ \ j)$
$=\sum_{i=1}^{n}\sum_{j=1}^m(n-\left \lfloor \frac{n}{i} \right \rfloor*i)(m-\left \lfloor \frac{m}{j} \right \rfloor*j)$
$=\sum_{i=1}^{n}\sum_{j=1}^m(nm-n*\left \lfloor \frac{m}{j} \right \rfloor*j-m*\left \lfloor \frac{n}{i} \right \rfloor+\left \lfloor \frac{m}{j} \right \rfloor*j*\left \lfloor \frac{n}{i} \right \rfloor*i)$
分成四部分,分別叫ABCD。
$A=n^2m^2$
$B=m^2\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor*i$
$C=n^2\sum_{i=1}^{m}\left \lfloor \frac{m}{i} \right \rfloor*i$
BC可以根號求,把根號求得那些東西分別叫$EF$,即$B=m^2E$,$C=n^2F$。
$D=\sum_{i=1}^{n}\sum_{j=1}^{m}\left \lfloor \frac{n}{i} \right \rfloor\left \lfloor \frac{m}{j} \right \rfloor ij=\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor *i \sum_{j=1}^{m}\left \lfloor \frac{m}{j} \right \rfloor*j=\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor *iF=F\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor *i=EF$
$i=j$的情況同理我就不寫了。。太多了
註意這個模數不是質數,但2和6的“逆元”要用還是有的,用模數+1再/2或/6即可。
不知道這模數什麽梗。。?
1 //#include<iostream> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cstdio> 5 //#include<map> 6 #include<math.h> 7 //#include<time.h> 8 //#include<complex> 9 #include<algorithm> 10 using namespace std; 11 12 int n,m; 13 const int mod=19940417,six=3323403,two=9970209; 14 15 int main() 16 { 17 scanf("%d%d",&n,&m); if (n<m) {int t=n; n=m; m=t;} 18 int A,B,C,D,E,F,G; A=B=C=D=E=F=G=0; 19 A=1ll*n*n%mod*m%mod*m%mod; 20 for (int i=1,last;i<=n;i=last+1) 21 { 22 last=n/(n/i); 23 E+=(n/i)*1ll*(i+last)%mod*(last-i+1)%mod*two%mod; E-=E>=mod?mod:0; 24 } 25 B=1ll*m*m%mod*E%mod; 26 for (int i=1,last;i<=m;i=last+1) 27 { 28 last=m/(m/i); 29 F+=(m/i)*1ll*(i+last)%mod*(last-i+1)%mod*two%mod; F-=F>=mod?mod:0; 30 } 31 C=1ll*n*n%mod*F%mod; 32 D=1ll*E*F%mod; 33 for (int i=1,last,tmp=1ll*n*m%mod;i<=m;i=last+1) 34 { 35 last=min(n/(n/i),m/(m/i)); 36 G+=(1ll*tmp*(last-i+1)-1ll*n*(m/i)%mod*(i+last)%mod*(last-i+1)%mod*two%mod 37 -1ll*m*(n/i)%mod*(i+last)%mod*(last-i+1)%mod*two%mod 38 +1ll*(n/i)*(m/i)%mod*(1ll*(last)*(last+1)%mod*(last+last+1)%mod-1ll*(i-1)*i%mod*(i+i-1)%mod)%mod*six%mod)%mod; 39 G=(G%mod+mod)%mod; 40 } 41 printf("%lld\n",(0ll+A-B-C+D-G+mod)%mod); 42 return 0; 43 }View Code
BZOJ2956: 模積和