分开考虑k=1 k=2和k>=3的情况
2和3这两个质数比较特殊,遇到的话直接输出1就行
对于“神灵的不满意度为m的约数中,比m小且最大的那个”这句描述,指m除了自身和1这两个因子里找最大的那个
可以从2找到sqrt(m),根据因子总是成对出现(除了sqrt(m)),所以找到一个最小因子i就可以把m/i作为最大因子
如果是质数,输出1
输入n和k
k=1时,只能一次性全部进贡,直接走上述过程
k=2时,如果这个数是偶数,可以根据“偶数总能拆成两个质数之和”输出2(2和3已经特殊考虑)
如果是奇数,判断是否是质数,是则输出1,否则去寻找比n小的最大的质数p,则n可以分成p和n-p两部分(因为p最大,所以n-p尽可能小,其最大因子也能尽可能小)
k=3时,如果这个数是偶数,可以根据“偶数总能拆成两个质数之和”输出2(同上)
但是,如果是奇数,判断是否是质数,是则输出1,否则将n拆成n-2和2两部分,因为2是质数,n-2此时是奇数,判断n-2是不是质数,是则输出2,否则可以把n分成3和n-3两部分,n-3定为偶数,根据“偶数总能拆成两个质数之和”,直接输出3
1 #include<bits/stdc++.h> 2 using namespace std; 3 int findm(int in){ 4 int i,d=sqrt(in); 5 for(i=2;i<=d;i++) 6 if(in%i==0) 7 return in/i; 8 return 1; 9 } 10 bool isp(int in){ 11 int i,d=sqrt(in); 12 for(i=3;i<=d;i+=2) 13 if(in%i==0) 14 return false; 15 return true; 16 } 17 int main(){ 18 ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 19 int T,n,m,k; 20 cin>>T; 21 while(T--){ 22 cin>>n>>k; 23 if(n==2||n==3) 24 cout<<1<<endl; 25 else{ 26 if(k==1) 27 cout<<findm(n)<<endl; 28 else if(k==2){ 29 if(n%2==1){ 30 if(isp(n)) 31 cout<<1<<endl; 32 else{ 33 m=n-2; 34 while(!isp(m)) 35 m-=2;//n是奇数,除2外质数均为奇数,所以每次-2 36 cout<<findm(n-m)+1<<endl; 37 } 38 } 39 else 40 cout<<2<<endl; 41 } 42 else if(k>=3){ 43 if(n%2==1){ 44 if(isp(n)) 45 cout<<1<<endl; 46 else{ 47 if(isp(n-2)) 48 cout<<2<<endl; 49 else 50 cout<<3<<endl; 51 } 52 } 53 else 54 cout<<2<<endl; 55 } 56 } 57 } 58 59 return 0; 60 }
来源:https://www.cnblogs.com/stelayuri/p/12238981.html