BZOJ 2956 模积和 (分块加速)

2019-04-13 21:09发布

i=1n1<=j<=m,ji(n mod i)(m mod j)=i=1n1<=j<=m,ji(nini)(mjmj)=i=1n(nini)1<=j<=m,ji(mjmj)=i=1n(nini)j=1m(mjmj)i=1min(n,m)(nini)(mjmj)=(n2i=1nini)(m2i=1mimi)min(n,m)nm+(mi=1min(n,m)ini+ni=1min(n,m)imi)i=1min(n,m)i2nimi 然后分块加速搞就可以了,总的复杂度:o(n),注意乘积越界的问题,还有取模的问题就搞定了。 #include #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i) using namespace std; const int Mod = 19940417; LL inv; LL n,m; void Gcd(LL a,LL b,LL& d,LL& x,LL& y){ if(!b) {d = a;x = 1;y = 0;} else{Gcd(b,a%b,d,y,x);y -= x*(a/b);} } LL Inv(LL a,LL n){ LL d,x,y; Gcd(a,n,d,x,y);