bzoj2956 模积和

2019-04-13 14:23发布

题目 来来来,数学推公式吧。。。。 这里写图片描述 这里写图片描述 之后再用求和算一算就好了。。。 #include #define mod 19940417 #define LL long long using namespace std; LL m,n,ans,tmp1,tmp2,tmp3,last; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline LL read() { LL x=0,b=1; char c=nc(); for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1; for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0'; return x*b; } inline LL sum(LL x) { return x*(x+1)%mod*(2*x+1)%mod*3323403%mod; } int main() { // freopen("in.txt","r",stdin); n=read(),m=read(); // ans=0; // for(LL i=1;i<=n;i++) // for(LL j=1;j<=m;j++) // { // if(i==j)continue; // ans=(LL)(ans+(n%i)*(m%j))%mod; // } // cout<if(n>m)swap(m,n); tmp1=n*n%mod; for(LL i=1;i<=n;i=last+1) { last=n/(n/i); tmp1=((tmp1-(n/i)*(last+i)%mod*(last-i+1)%mod*9970209%mod)%mod+mod)%mod; } tmp2=m*m%mod; for(LL i=1;i<=m;i=last+1) { last=m/(m/i); tmp2=((tmp2-(m/i)*(last+i)%mod*(last-i+1)%mod*9970209%mod)%mod+mod)%mod; } tmp3=n*n%mod*m%mod; for(LL i=1;i<=n;i=last+1) { last=min(n/(n/i),m/(m/i)); tmp3=((tmp3-n*(m/i)*(last+i)%mod*(last-i+1)%mod*9970209%mod)%mod+mod)%mod; tmp3=((tmp3-m*(n/i)*(last+i)%mod*(last-i+1)%mod*9970209%mod)%mod+mod)%mod; tmp3=((tmp3+(n/i)*(m/i)%mod*(sum(last)-sum(i-1)))%mod+mod)%mod; } cout<<((tmp1*tmp2%mod-tmp3)%mod+mod)%mod; return 0; }