感动,第一次看着题解把推式子的过程全部搞懂
安利 dalao 的blog: https://blog.csdn.net/lvzelong2014/article/details/79121359
题意:
(n,m<=1e7)
错啦!mod 20101009
上面给了dalao的blog,我就不写题解了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=20101009,sz=1e7+100;
int pri[sz],cnt,n,m;
ll g[sz];
bool npri[sz];
void init()
{
g[1]=1ll;
int i,j,xx;
for (i=2;i<sz;++i)
{
if (!npri[i])
{
pri[++cnt]=i;
g[i]=1ll*i*(1-i)%mod;
}
for (j=1;j<=cnt;++j)
{
xx=i*pri[j];
if (xx>=sz) break;
npri[xx]=1;
if (!(i%pri[j]))
{
g[xx]=g[i]*pri[j]%mod;
break;
}
g[xx]=g[i]*g[pri[j]]%mod;
}
}
for (i=1;i<sz;++i) g[i]=(g[i]+g[i-1])%mod;
}
inline ll min(ll x,ll y){return x<y?x:y;}
inline ll sum(ll x){return (x*(x+1)>>1)%mod;}
int main()
{
register ll l,r,l1,l2;
ll ans=0;
init();
scanf("%d %d",&n,&m);
if (n>m) swap(n,m);
for (l=1;l<=n;l=r+1)
{
l1=n/l;l2=m/l;
r=min(n/l1,m/l2);
ans=(ans+sum(l1)*sum(l2)%mod*(g[r]-g[l-1])%mod)%mod;
}
printf("%lld\n",(ans+mod)%mod);
}