zoukankan      html  css  js  c++  java
  • ZJNU 2354

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

    #include<bits/stdc++.h>
    using namespace std;
    int findm(int in){
        int i,d=sqrt(in);
        for(i=2;i<=d;i++)
            if(in%i==0)
                return in/i;
        return 1;
    }
    bool isp(int in){
        int i,d=sqrt(in);
        for(i=3;i<=d;i+=2)
            if(in%i==0)
                return false;
        return true;
    }
    int main(){
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
        int T,n,m,k;
        cin>>T;
        while(T--){
            cin>>n>>k;
            if(n==2||n==3)
                cout<<1<<endl;
            else{
                if(k==1)
                    cout<<findm(n)<<endl;
                else if(k==2){
                    if(n%2==1){
                        if(isp(n))
                            cout<<1<<endl;
                        else{
                            m=n-2;
                            while(!isp(m))
                                m-=2;//n是奇数,除2外质数均为奇数,所以每次-2
                            cout<<findm(n-m)+1<<endl;
                        }
                    }
                    else
                        cout<<2<<endl;
                }
                else if(k>=3){
                    if(n%2==1){
                        if(isp(n))
                            cout<<1<<endl;
                        else{
                            if(isp(n-2))
                                cout<<2<<endl;
                            else
                                cout<<3<<endl;
                        }
                    }
                    else
                        cout<<2<<endl;
                }
            }
        }
        
        return 0;
    }
  • 相关阅读:
    浏览器加载AMD标准的输出文件
    Mac安装brew && brew 安装yarn
    插件集
    vue-router复用组件时不刷新数据
    加入sass后运行项目报错:TypeError: this.getResolve is not a function
    安装cnpm后运行报cnpm : 无法加载文件 C:UsersyizonAppDataRoaming pmcnpm.ps1,因为在此系统上禁止运行脚本
    图片canvas跨域问题解决方案之一
    vscode配置
    搭建express服务
    项目初始化
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12238981.html
Copyright © 2011-2022 走看看