zoukankan      html  css  js  c++  java
  • hdu--5108--数论

    数据因为很大 达到 max=1e9

    首先 素数筛选出 sqrt(max)的范围内有多少素数

    然后 对于每个n  求出它的所有因子 sort一遍后 从小到大开始遍历过去

    特判下 对于n大于 sqrt(max)的情况下 是否为素数的情况 因为N>1e6的情况不超过100组 所以不会特判很多次的

     1 #include <iostream>
     2 #include <vector>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int size = 100000;
     8 bool vis[size+10];
     9 vector<int>ve;
    10 
    11 void init( )
    12 {
    13     memset( vis , true , sizeof(vis) );
    14     vis[0] = vis[1] = false;
    15     for( int i = 2 ; i<=size ; i++ )
    16     {
    17         if( vis[i] )
    18         {
    19             int j = i * 2;
    20             while( j<=size )
    21             {
    22                 vis[j] = false;
    23                 j += i;
    24             }
    25         }
    26     }
    27 }
    28 
    29 void solve( int n )
    30 {
    31     ve.clear();
    32     for( int i = 1 ; i*i<=n ; i++ )
    33     {
    34         if( n%i==0 )
    35         {
    36             ve.push_back( i );
    37             if( i*i!=n )
    38                 ve.push_back( n/i );
    39         }
    40     }
    41     sort( ve.begin() , ve.end() );
    42 }
    43 
    44 bool judge( int x )
    45 {
    46     if( x%2==0 )
    47         return false;
    48     for( int i = 3 ; i*i<=x ; i+=2 )
    49     {
    50         if( x%i==0 )
    51             return false;
    52     }
    53     return true;
    54 }
    55 
    56 int main()
    57 {
    58     int n , ans , cnt;
    59     bool flag;
    60     init( );
    61     while( ~scanf("%d",&n) )
    62     {
    63         solve( n );
    64         cnt = ve.size();
    65         ans = 0;
    66         flag = false;
    67         for( int i = 0 ; i<cnt ; i++ )
    68         {
    69             if( n/ve[i]>size )
    70             {
    71                 flag = judge( n/ve[i] );
    72                 if( flag )
    73                 {
    74                     ans = ve[i];
    75                     break;
    76                 }
    77             }
    78             else if( vis[ n/ve[i] ] )
    79             {
    80                 ans = ve[i];
    81                 break;
    82             }
    83         }
    84         printf( "%d
    ",ans );
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    创建一个带有Event Receiver的List Definition
    查看安全日志的方式
    SysWOW64是个什么文件夹?
    IIS Log的位置
    IIS的metabase文件的位置
    Server Error in '哪一个' Application, 值得注意哦
    记录一个在SharePoint的代码中提升运行权限的方法
    Rollup and cube
    杀死数据库连接
    VS2005最近项目和最近文件清除
  • 原文地址:https://www.cnblogs.com/radical/p/4115796.html
Copyright © 2011-2022 走看看