Educational Codeforces Round 54 (Rated for Div. 2) B. Divisor Subtraction(思維)
阿新 • • 發佈:2018-12-21
題意是輸入一個n,求出n的最小質因數d,然後n減去d,每減一次算一次操作,問需要減多少次才能使n減為0
思路就是分情況討論,對於偶數來說最小的質因數就是2,所以直接除以2就好了,對於奇數來說,如果這個數是素數,直接減去它本身操作1次就夠了,如果不是素數我們就求出它的最小質因數,然後用n減去它,記錄減去的次數,直到n變成素數或者偶數就好了。
AC程式碼:
#include <bits/stdc++.h> #define ll long long using namespace std; ll n; bool Check(ll num){ if(num == 1)return false; if(num == 2 || num == 3){ return true; } if(num % 6 != 1 && num % 6 != 5){ return false; } for(ll i = 5; i*i <= num; i += 6){ if(num % i == 0 || num % (i+2) == 0){ return false; } } return true; } int main() { cin>>n; if(n % 2 == 0){ cout<<n / 2<<endl; } else{ ll cnt = 0; ll ans; if(Check(n)){ cout<<"1"<<endl; } else{ while(n){ ll i; for(i=2;i<=n;i++){ if(n % i == 0){ break; } } n -= i; cnt ++; if(Check(n)){ cout<<cnt+1<<endl; break; } if(n % 2 == 0){ cout<<cnt+n/2<<endl; break; } } } } return 0; }