【欧拉函数(初级)φ函数】
【欧拉函数例题1】
题目来源://http://119.23.110.242/problem/173
【题目描述】
给你一个正整数n,请问有多少个比n小的且与n互质的正整数?
两个整数互质的意思是,这两个整数没有比1大的公约数。
【输入输出格式】
【输入格式】:
一行,一个正整数n(n≤1000000000)。
【输出格式】:
一行,输出比n小的且与n互质的正整数个数。
【输入输出样例】
【输入样例】:
7
【输出样例】:
6
【说明】
128MB,1000ms
【欧拉函数例题1程序】
//#173. 互质
//http://119.23.110.242/problem/173
#include<cmath>
#include<fstream>
#include<iostream>
using namespace std;
int n,ans=1;
void work()
{
int nx=n;
for(int i=2;i<sqrt(n);i++)
{
int k=0;
while(!(nx%i))
{
nx/=i;
k++;
}
if(k)
{
if(k^1)ans*=pow(i,k)-pow(i,k-1);
else ans*=(i-1);
}
}
if(nx!=1)ans*=(nx-1);
}
int main()
{
scanf("%d",&n);
work();
printf("%d",ans);
return 0;
}
【欧拉函数例题2】
题目来源:https://www.luogu.org/problemnew/show/P1592
【题目描述】
输入两个正整数n和k,求与n互质的第k个正整数。
【输入输出格式】
【输入格式】:
仅一行,为两个正整数n(≤106)和k(≤108)。
【输出格式】:
一个正整数,表示与n互质的第k个正整数。
【输入输出样例】
【输入样例】
10 5
【输出样例】
11
【时空限制】
1000ms / 128MB
【欧拉函数例题2程序】
//P1592 互质
//https://www.luogu.org/problemnew/show/P1592
#include<cmath>
#include<fstream>
#include<algorithm>
using namespace std;
int n,k,total;
int num[50000005];
void work()
{
for(int i=1;i<n;i++)
{
if(__gcd(i,n)==1)
{
num[++total]=i;
}
}
int sum=k%total;
if(!sum)sum=total;
printf("%d",num[sum]+k/total*n);
}
int main()
{
scanf("%d%d",&n,&k);
work();
return 0;
}