您的位置:首页 > 其它

[SDOI2012]Longge的问题 phi运用

2017-09-08 23:00 381 查看
大体思路见过,但是已经模糊了,复习一下

要求sigma(gcd(n,i)),1<=i<=n

枚举因子x,gcd(i,n)==x,要知道ii的个数

即是gcd(i/x,n/x)==1的个数,这可以用phi(n/x)求出有多少个i/x

#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 ull unsigned long long
#define pb push_back
#define FOR(a) for(int i=1;i<=a;i++)
const int inf=0x3f3f3f3f;
const ll Linf=9e18;
const int maxn=1e5+7;
const ll mod=100003;
const double eps=1e-6;

ll n,ans;
int m;

ll eular(ll n){
ll ans=n;
for(int i=2;i<=m;i++){
if(n%i==0){
ans-=ans/i;
while(n%i==0)n/=i;
}
}
if(n>1)ans-=ans/n;
return ans;
}

int main(){
scanf("%lld",&n);
m=sqrt(n);

for(int i=1;i<=m;i++){
if(n%i==0){
if(n/i==i){
ans+=i * eular(n/i);
}else{
ans+=i * eular(n/i) + n/i * eular(i);
}
}
}
printf("%lld\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: