joj 2330: Math

来源:互联网 发布:php常用算法有哪些 编辑:程序博客网 时间:2024/06/08 17:24
ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE1s8192K39554Standard
Given a nonnegative integer a, and a positive integer N, we define:
f(a, 1) = a
f(a, k) = f(a, k – 1) * f(a, k – 1) % N, k > 1
There may or may not exist some positive integer k satisfying f(a, k) = 0.
Your task is, given a positive integer N, to determine how many a (0 <= a <= N) there are, such that for some positive integer k, f(a, k) = 0.

Input

The input contains an integer T on the first line, indicating the number of test cases. Each test case contains only one positive integer N (1 <= N <= 1000000000) on a line.

Output

For each test case, output the answer on a single line.

Sample Input

621250180245361

Sample Output

2367820/*
最悲剧的一道题,一开用cin,cout来输入输出数据,一直TLE,各种剪枝,各种预处理,都TLE,后来改正scanf,printf坑爹的居然过了。。。
于是果断以后再也不用cin,cout了。
  我的代码不算快,有师兄0.05s过的,我的0.09s,有机会膜拜下。
*/
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <memory>
  4. #include <cmath>
  5. using namespace std;
  6. int prime[10000];
  7. const int maxn=40000;
  8. int search (int n,int f)
  9. {
  10.     int m=sqrt(n+0.5);
  11.    for ( int i=f ; prime[i]<=m &&i<8000; i++)
  12.     if(n%prime[i]==0)return prime[i];
  13.    return n;
  14. }
  15. int main ()
  16. {
  17. int c = 0;
  18. bool vis[maxn] ;
  19.     memset (vis , 1 ,sizeof(vis));
  20.     for(int i=2; i<220 ; i++)
  21.      if(vis[i])
  22.       {
  23.         for (int j=i*i; j<maxn ; j+=i)
  24.         vis[j]=0;
  25.       }//筛素数
  26.     for (int i=2 ; i<maxn ;i++)
  27.      if(vis[i])
  28.      prime[c++]=i;//将筛出的素数存入数组中
  29. /*   for(int i=0 ; i<50 ; i++)
  30.     cout<<prime[i]<<" ";*/
  31. int t;
  32. cin>>t;
  33. while (t--)
  34. {
  35.     int  n,i=1;
  36.     scanf("%d",&n);
  37.    int   nn=n;
  38.     int  ans =1;
  39.     int j=0;
  40.     while (n!=1)
  41.     {
  42.      int d=search(n,j++);
  43.      ans*=d;
  44.      while(n%d==0)n=n/d;
  45.     }//找出n的所有素因子(不重复)并保存其积
  46.     ans=nn/ans + 1;
  47.     printf("%d/n",ans);
  48. }
  49. return 0;
  50. }