joj 2330: Math

Result TIME Limit MEMORY Limit Run Times AC Times JUDGE
1s 8192K 395 54 Standard
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

6
2
12
50
180
245
361

Sample Output

2
3
6
7
8
20
/*
最悲剧的一道题,一开用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. }

你可能感兴趣的:(joj 2330: Math)