链接:戳这里
思路:首先肯定知道是求所有组个的gcd(x,y)和,但是暴力枚举的话会超时,下面我们去想一下枚举d=gcd(x,y) d作为最大公约数的个数
发现只需要O(nlogn) 好就是这样,这里需要处理掉d的倍数作为最大公约数的个数
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 using namespace std; int n,m; ll f[100100]; int main(){ scanf("%d%d",&n,&m); if(n>m) swap(n,m); for(int i=n;i>=1;i--){ f[i]+=(ll)(n/i)*(m/i); for(int j=i*2;j<=n;j+=i){ f[i]-=f[j]; } } ll ans=0; for(int i=n;i>=1;i--) ans+=f[i]*(i*2-1); cout<<ans<<endl; return 0; }