题目地址:点击打开链接
思路:欧拉函数的简单应用,建议先看本博客算法精讲里面关于欧拉函数的介绍
AC代码1:
#include <iostream> #include <cstdio> using namespace std; int main() { int t,n,i,rea; scanf("%d",&t); while(t--) { scanf("%d",&n); rea = n; for(i=2; i<=n; i++) { if(n % i == 0) { rea = rea - rea / i; while(n % i == 0) n /= i; } } printf("%d\n",rea); } return 0; }错误代码:
#include <iostream> #include <cstdio> using namespace std; int main() { int t,n,i,rea; scanf("%d",&t); while(t--) { scanf("%d",&n); rea = n; for(i=2; i*i<=n; i++) { if(n % i == 0) { rea = rea - rea / i; while(n % i == 0) n /= i; } } if(n > 1)//这里考虑到的是n本身就是一个素数,,则与他互素且比他小的数为n-1; rea -= 1; printf("%d\n",rea); } return 0; }
#include <iostream> #include <cstdio> using namespace std; int main() { int t,n,i,rea; scanf("%d",&t); while(t--) { scanf("%d",&n); rea = n; for(i=2; i*i<=n; i++) { if(n % i == 0) { rea = rea - rea / i; while(n % i == 0) n /= i; } } if(n > 1)//其实这里的n>1包含2种情况(1)n本身就是一个素数,则与他互素且比他小的数为n-1(2)n的最后一个素因子没有进行rea = rea - rea / i就跳出来了 rea -= rea / n;//基于以上2种情况,这里不能写为rea -= 1; printf("%d\n",rea); } return 0; }
AC代码3:
先用筛选法打出素数
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int isprime[32768],prime[30000]; void doprime() { int i,j,nprime = 0; memset(isprime,true,sizeof(isprime)); for(i=2; i<32768; i++) { if(isprime[i]) { prime[nprime++] = i; for(j=i*i; j<32768; j+=i) { isprime[j] = false; } } } } int main() { int t,n,i,rea; scanf("%d",&t); doprime(); while(t--) { scanf("%d",&n); rea = n; for(i=0; prime[i]*prime[i]<=n; i++) { if(n % prime[i] == 0) { rea = rea - rea / prime[i]; while(n % prime[i] == 0) n /= prime[i]; } } if(n > 1) rea -= rea / n; printf("%d\n",rea); } return 0; }
AC代码4:
递推法求欧拉函数
#include <iostream> #include <cstdio> #define maxn 32768//不能加分号 int a[32770]; int main() { int i,j,t,n; for(i=1; i<maxn; i++) a[i] = i; for(i=2; i<maxn; i+=2) a[i] /= 2; for(i=3; i<maxn; i+=2) { if(a[i] == i) { for(j=i; j<maxn; j+=i) { a[j] -= a[j] / i; //a[j] = a[j] / i * (i-1);2种方法都行,先除是为了防止中间数据溢出 } } } scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%d\n",a[n]); } return 0; }