CF1076B Divisor Subtraction

题目大意:
   输入n,不断将n赋值为n-p(p为n的最小质因数),问减多少次n=0。(2≤n≤1010).

思路:

    偶数的最小质因子为2,并且减之后还一直为2;奇数的最小质因子一定是奇数,相减后变为2

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 
 7 using namespace std;
 8 
 9 const int  maxn=100000;
10 int pri[maxn+10],prin;
11 long long n;
12 bool shaizi[maxn+10];
13 
14 void init()
15 {
16     memset(shaizi,0,sizeof(shaizi));
17     shaizi[1]=true;
18     for(int i=1;i<=maxn;i++)
19     {
20         if(!shaizi[i])
21         {
22             prin++;
23             pri[prin]=i;
24         }
25         for(int j=1;j<=prin&&i*pri[j]<=maxn;j++)
26         {
27             shaizi[i*pri[j]]=true;
28             if(i%pri[j]==0)break;
29         }
30     }
31 }
32 
33 int main()
34 {
35     cin>>n;
36     if(n==0)
37     {
38         printf("0\n");
39         return 0;
40     }
41     if(!n&1)
42     {
43         cout<<n/2<<endl;
44         return 0;
45     }
46     //int s=sqrt(n);
47     init();
48     int f=0;
49     for(int i=1;i<=prin;i++)
50     {
51         if(n%pri[i]==0)
52         {
53             n-=pri[i];
54             f=1;
55             break;
56         }
57     }
58     if(!f)printf("1\n");
59     else cout<<n/2+1<<endl;
60     return 0;
61 }

猜你喜欢

转载自www.cnblogs.com/LiqgNonqfu/p/9966948.html