GCD

来源:互联网 发布:imp oracle 导入数据 编辑:程序博客网 时间:2024/05/22 07:03

训练指南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\n",S[n]);}}


原创粉丝点击