ZJNU 2354 - 进贡

前提是你 提交于 2020-01-28 21:50:20

分开考虑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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!