GCD - Extreme (II) UVA - 11426 phi函数运用

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


posted @ 2017-08-04 17:35  Drenight  阅读(183)  评论(0编辑  收藏  举报