您的位置:首页 > 其它

【BZOJ 2005】 [Noi2010]能量采集 求gcd个数

2017-01-21 22:07 337 查看
首先我们设g[x]表示x为gcd(a,b)约数的(a,b)对数,那么显然有g[x]=(n/x)*(m/x)

接着我们设f[x]表示gcd(a,b)=x 的(a,b)对数那么还是显然f[x]=g[x]-f[2*x]-f[3*x]-f[4*x].......

那么我们直接倒着枚举x然后计算答案就好了。

#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
LL n,m,k,f[100051],ans;

int main(){
cin>>n>>m;k=min(n,m);
for(LL i=k;i;i--){
f[i]=(n/i)*(m/i);
for(LL j=2;j*i<=k;j++)f[i]-=f[i*j];
ans+=f[i]*(2*i-1);
}
cout<<ans;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: