训练指南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]);
}
}