2 25608 24027
7680 16016
题意:找小于n且与n互质的数有几个。欧拉公式正好解决。
此题最早的思路是用gcd来计算,但是估测了一下,感觉应该要超时,提交了一下,果然 = =!
先贴上TLE的代码吧:
#include <stdio.h> int gcd(int a,int b) { int t; if (a%b==0) return b; else { t=a%b; gcd(b,t); } } int main() { int u; int n; int ans; scanf ("%d",&u); while (u--) { scanf ("%d",&n); ans=0; for (int i=1;i<n;i++) { if (gcd(n,i)==1) ans++; } printf ("%d\n",ans); } return 0; }
下面是用欧拉公式做的,AC了:
#include <stdio.h> #include <math.h> int Eular(int n) { int ans=1; for (int i=2;i<=sqrt((double)n);i++) { if (n%i==0) { n/=i; ans*=(i-1); //若n有个因子是i的k次,根据欧拉公式有下面的代码 while (n%i==0) { n/=i; ans*=i; } } } if (n>1) //若最后剩的数为大于5的素数,根据欧拉公式再算进去 ans*=(n-1); return ans; } int main() { int u; int n; int ans; scanf ("%d",&u); while (u--) { scanf ("%d",&n); ans=Eular(n); printf ("%d\n",ans); } return 0; }