题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=471
还是直接上代码。。
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 100000; int vis[N+5]; vector<int> a[N+4]; //a[i]中存储i的所有质因数 void init() { for(int i=2;i<=N;i++) if(!vis[i]) //i->prime { a[i].push_back(i); for(int j=i+i;j<=N;j+=i) { a[j].push_back(i); vis[j]=1; } } } int b[1010]; //b[]中临时存储a[x]中2^a[x].size()个组合中各个数的乘积 LL cal(int x,int n) { LL ret=n,g=0; b[++g]=1; for(int i=0;i<a[x].size();i++) { int t=g; for(int j=1;j<=g;j++) b[++t]=-b[j]*a[x][i],ret+=n/b[t]; g=t; } return ret; } int main() { init(); int t;cin>>t; while(t--) { int n,m;cin>>n>>m; if(n<m) swap(n,m); LL ans=n; for(int i=2;i<=m;i++) ans+=cal(i,n); cout<<ans<<endl; } }