bzoj2956: 模积和

xiaoxiao2021-02-28  96

链接

  http://www.lydsy.com/JudgeOnline/problem.php?id=2956

题解

  这题难点在第一步,第一步想到后面就一路畅通了   先不考虑 ij 这个条件   

i=1nj=1m(n mod i)(m mod j)  =i=1nj=1m(nni)(mmj)   然后再减去 i=j 的情况(公式略)   画出柿子来搞一搞就好了。    博主真是懒

代码

//画柿子题 #include <cstdio> #include <algorithm> #define ll long long #define mod 19940417ll using namespace std; ll n, m, ans, tmp; inline ll sum(ll a, ll b){return ((a+b)*(b-a+1)>>1)%mod;} inline ll suan(ll x) { if(x*(x+1)%3==0)return x*(x+1)/6%mod*(2*x+1)%mod; else return x*(x+1)/2%mod*(2*x+1)/3%mod; } inline ll sum2(ll a, ll b){return (suan(b)-suan(a-1))%mod;} int main() { ll i, last; scanf("%lld%lld",&n,&m); if(n>m)swap(n,m); for(i=1;i<=m;i=last+1) { last=m/(m/i); tmp=(tmp+m*(last-i+1)-m/i*sum(i,last))%mod; } for(i=1;i<=n;i=last+1) { last=n/(n/i); ans=(ans+(n*(last-i+1)-n/i*sum(i,last))%mod*tmp)%mod; } tmp=n*m%mod*n%mod; for(i=1;i<=n;i=last+1) { last=min(n/(n/i),m/(m/i)); tmp=(tmp-n*(m/i)%mod*sum(i,last)-m*(n/i)%mod*sum(i,last))%mod; tmp=(tmp+(n/i)*(m/i)%mod*sum2(i,last))%mod; } ans=(ans-tmp)%mod; printf("%lld",(ans+mod)%mod); return 0; }
转载请注明原文地址: https://www.6miu.com/read-54474.html

最新回复(0)