题意:
有一个n*m的数表,(i,j)位置上的数是LCM(i,j);
求这个数表的和;
n,m<=10^7,多组数据
Crash的数字表格加强版
题解:
考虑把lcm转化成gcd
那答案就是
然后神奇的设:
就有:
一样可以枚举
的取值,这是O(√n)的;
然后求f(x,y);
大概证明了一下= =
线性筛之后也可以O(√n)求出f(x,y)
总复杂度O(n),常数略大。。
设
“积性函数的约数和也是积性函数” ->好像比较显然?
所以g(D)是积性函数
线性筛裸上就好
代码:
#include
#include
#include
#define N 10010000
#define mod 100000009ll
using namespace std;
typedef long long ll;
ll pri[N>>3],tot;
ll g[N],sum[N];
bool vis[N];
void init()
{
g[1]=sum[1]=1;
for(ll i=2;im) swap(n,m);
for(i=1,ans=0;i<=n;i=j+1)
{
j=min(n/(n/i),m/(m/i));
ans+=F(n/i,m/i)*(sum[j]-sum[i-1]+mod)%mod;
ans%=mod;
}
printf("%lld\n",ans);
}
return 0;
}