码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ2956: 模积和

时间:2018-03-01 00:31:12      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:names   lib   open   sum   div   ide   last   algorithm   pac   

$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: 模积和

标签:names   lib   open   sum   div   ide   last   algorithm   pac   

原文地址:https://www.cnblogs.com/Blue233333/p/8486071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!