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\n",ans );
85     }
86     return 0;
87 }

时间: 2024-11-07 16:47:35

hdu--5108--数论的相关文章

hdu 5108(数论-整数分解)

Alexandra and Prime Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1847    Accepted Submission(s): 629 Problem Description Alexandra has a little brother. He is new to programming. One

hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 889    Accepted Submission(s): 207 Problem Description "今有物不知其数,三三数之有二,五五数之有三,七七数之有

hdu 1124 数论

题意:求n!中末尾连续0的个数  其实就是2*5的个数 30! 中有5 10 15 20 25 30  是5的倍数有6个   6=30/5; 6/5=1; 这个1 为25 5  10 15 20  25  30 35 40 45 50 55 60  65 70 75 80  85 90 95 100      100/5=20; 25                     50                    75                     100       20/5=4

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

hdu 4961 数论 o(nlogn)

Boring Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 60    Accepted Submission(s): 30 Problem Description Number theory is interesting, while this problem is boring.   Here is the probl

hdu 1299 数论 分解素因子

题意:求1.1/x+1/y=1/z 给定z 求x,y的个数zsd:1: 要知道这个素数的因子的范围 范围为2--sqrt(n);2: 带入方程得:x = n * n / k + n ; 现在就变成了求x的值.又因为n一定大于k,所以转换成求n * n的分解数: 因为n = p1 ^ e1 * p2 ^ e2 *..........*pn ^ en sum ( n)= ( 1 + e1 ) * ( 1 +e2 ) * .........* ( 1 +en ); sum (n * n) = ( 1

hdu 1104 数论+bfs

题意:给n,m,k;输出n经过+-*%后(n%k+k)%k==((n+1)%k)%k  输出最小路径与运算副 zsd:% 只是求余数 有正负 mod 是求模 无正负. yhd:对m*k求余对 对k求余不对 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 5

hdu 1005 数论 循环

给定 ab 与飞 f1 f2 求f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 分析: 1 因为mod7   0<=f(n)  &&f(n)<=6  有7种取值 2 f(n-1) 与f(n-2) 共有49种组合 所以找到循环取值即可 Problem : 1005 ( Number Sequence ) Judge Status : Accepted RunId : 9085676 Language : G++ Author : xiaon

BestCoder18 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5108 题目意思:给出一个数正整数 N,N <= 1e9,现在需要找出一个最少的正整数 M,使得 N/M 是素数.如果找不到就输出0. 一开始有想过将所有 <= 1e9 的素数求出来的,不过绝对超时就放弃了:然后就开始从题目中挖掘简便的处理方法.受到求素数的方法启发,枚举的因子 i 如果在 i * i <= N 之内都没有找到符合条件的素数,那么那些 > N 的因子就更不可能了.于是时间

hdu 5108 Alexandra and Prime Numbers

http://acm.hdu.edu.cn/showproblem.php?pid=5108 找出最大质因子就可以. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 #define N 100000 6 using namespace std; 7 8 ll n; 9 10 11 int main() 12 { 13 while(scanf(