1. 程式人生 > >CF1076B Divisor Subtraction

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 }