训练指南p125
数论学到现在觉得最有意思的一道题
gcd(a,b)==c等价于gcd(a/c,b/c)==1
这样就可以用欧拉函数求出满足给定a,gcd(a,b)==c的b的个数
还有一个要点是算贡献取代枚举因子,这个思想最近多校运用的挺多的。。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include<bits/stdc++.h> #include<stdio.h> #include<algorithm> #include<queue> #include<string.h> #include<iostream> #include<math.h> #include<set> #include<map> #include<vector> #include<iomanip> using namespace std; #define ll long long #define pb push_back #define FOR(a) for(int i=1;i<=a;i++) const double PI = acos(-1.0); const int maxn=4e6+6; ll S[maxn]; ll f[maxn]; int phi[maxn]; void phi_table(){ phi[1]=1; for(int i=2;i<maxn;i++){ if(!phi[i]) for(int j=i;j<maxn;j+=i){ if(!phi[j])phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } void init(){ phi_table(); for(int i=1;i<maxn;i++){ for(int j=i*2;j<maxn;j+=i)f[j]+=i*phi[j/i]; } } int main(){ int n; init(); for(int i=1;i<maxn;i++){ S[i]=S[i-1]+f[i]; } while(scanf("%d",&n) && n){ printf("%lld ",S[n]); } }