zoukankan      html  css  js  c++  java
  • HDU1286+线性筛素数

    View Code
     1 /*
     2 欧拉函数+求与之互素的数的个数
     3 */
     4 #include<stdio.h>
     5 #include<string.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<iostream>
     9 #include<queue>
    10 #include<vector>
    11 #include<map>
    12 #include<math.h>
    13 typedef long long ll;
    14 //typedef __int64 int64;
    15 const int maxn = 40005;
    16 const int inf = 0x7FFFFFFF;
    17 const double pi = acos(-1.0);
    18 const double eps = 1e-8;
    19 using namespace std;
    20 int prime[ 50001 ],shu[ 50001 ];
    21 int getPrime( int n ){
    22     for( int i=1;i<n;i+=2 ) shu[ i ] = 1;
    23     for( int i=0;i<n;i+=2 ) shu[ i ] = 0;
    24     shu[ 1 ] = 0;
    25     shu[ 2 ] = 1;
    26     for( int i=3;i<n;i+=2 ){
    27         if( shu[i]==1 ){
    28             int t,delta;
    29             delta = i*2;
    30             t = delta+i;
    31             while( t<n ){
    32                 shu[ t ] = 0;
    33                 t += delta;
    34             }
    35         }
    36     }
    37     int cnt = 1;
    38     for( int i=2;i<n;i++ ){
    39         if( shu[i]==1 ){
    40             prime[ cnt++ ] = i;
    41             //printf("%d\n",i);
    42         }
    43     }
    44     return cnt;
    45 }
    46 int main(){
    47     //freopen( "in2.txt","r",stdin );
    48     //freopen( "out.txt","w",stdout );
    49     int ca;
    50     int cnt = getPrime( 50001 );
    51     
    52     scanf("%d",&ca);
    53     while( ca-- ){
    54         int n;
    55         scanf("%d",&n);
    56         
    57         if( shu[n]==1 ){
    58             printf("%d\n",n-1);
    59             continue;
    60         }
    61         
    62         int ans[ maxn ];
    63         int tt = 0;
    64         for( int i=1;i<cnt/*prime[i]*prime[i]<=n*/;i++ ){//在这里    WA了4,5次。。。
    65             if( n%prime[i]==0 ){
    66                 ans[ tt++ ] = prime[i];
    67                 //printf("%d\n",prime[i]);
    68             }
    69         }
    70         int res = n;
    71         for( int i=0;i<tt;i++ ){
    72             res = res*( ans[i]-1 )/ans[i];
    73         }
    74         //printf("n:%d ",n);
    75         printf("%d\n",res);
    76     }
    77     return 0;
    78 }

    没什么好说的。。。wa了几次。。。因为for循环条件没写好。。

    欧拉函数。。。

    keep moving...
  • 相关阅读:
    百度--买帽子
    网易--双核处理器
    京东--通过考试
    简单错误记录
    链表中的倒数第k个结点
    数值的整数次方
    二进制中1的个数
    TCP 三次握手
    旋转数组的最小数字
    用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3045708.html
Copyright © 2011-2022 走看看