• PAT.1096 Consecutive Factors


    PAT.1096 Consecutive Factors

    题目链接

    看题干的意思是给出一个数n,要你寻找在所有可能的因数分解序列上上最长的连续因数子序列,输出这个长度并输出最小的子序列。

    说实话这个最小我一开始没怎么看明白,因为如果说最小是左界最小,那明显样例的输出应该是1*2*3而不是5*6*7,但如果说这个最小指的是size最小,那输出应该是3,也不是5*6*7,于是我陷入了疑惑…

    首先想到的做法是在1-N的范围上做滑动窗口,还就那个处理连续子序列相关问题的经典思路,先是按照左界最小的做法提交了一次(当然不可能是对的,因为样例都过不了)。

    一些尝试

    在左界最小没能通过的情况下,在左界最小的基础上不考虑因数分解中包含1的情况,即从2开始做滑动窗口,拿到了15/20,最后一个测试点超时(想想也是,毕竟1e9的数据摆在那里)。

    那么看来题干的最小很可能是最小左界,同时不包含1的情况。

    #include
    
    using namespace std;
    typedef long long ll;
    
    ll n,l = 2,r = 2,maxSize = 0;
    deque<ll> res;
    deque<ll> window;
    
    int main(){
        cin>>n;
        while(r <= n){
            if(n % r == 0){
                window.push_back(r);
                if(r - l + 1 > maxSize){
                    maxSize = r - l + 1;
                    res = window;
                }
                r++;
            }else{
                if(!window.empty()) window.pop_front();
                l++;
                r = max(l,r);
            }
        }
        cout<<maxSize<<endl;
        while(!res.empty()){
            cout<<res.front();
            res.pop_front();
            if(res.size() > 0) cout<<"*";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    题解

    还就那个恶堕然后使用枚举。

    首先考虑枚举什么,因为连乘增长很快,只要大概十几连乘就能超过1e9,所以我们可以考虑枚举子序列的长度。同时显然,只要两个大于sqrt(n)的数相乘就会大于n,所以我们枚举子序列中的数的时候只需要考虑小于sqrt(n)的数(这里有一点需要注意,就是序列刚好跨过开根的情况,比如6=2*3,所以实际上我们应该枚举的范围是2 ~ sqrt(n) + 1

    理清思路后我们只要从枚举左界的同时枚举子序列的长度即可,对于PAT的数据,考虑到开根的情况,子序列长度枚举到6、7就能过全部测试点了。

    特别需要注意的是

    • 这个方法对质数无可奈何,当n为质数时会得到最大子序列长度为0,所以我们需要进行特判,在这种情况下直接输出1\nN
    #include
    
    using namespace std;
    typedef long long ll;
    
    ll n,carry;
    int r,maxSize;
    vector<int> window;
    vector<int> res;
    
    int main(){
        cin>>n;
        r = sqrt(n) + 1;
        for(int i = 2 ; i <= r ; ++i){
            carry = 1;
            window.clear();
            for(int len = 1 ; len <= 6 ; ++len){
                carry *= i + len - 1;
                if(n % carry == 0){
                    window.push_back(i + len - 1);
                    if(window.size() > maxSize){
                        maxSize = window.size();
                        res = window;
                    }
                }else break;
            }
        }
        if(maxSize == 0) cout<<1<<endl<<n;
        else{
            cout<<maxSize<<endl;
            for(int i = 0 ; i < maxSize ; ++i){
                cout<<res[i];
                if(i != maxSize - 1) cout<<"*";
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    Redis快速上手篇八(redission完善分布式锁)
    基于Python实现的神经网络分类MNIST数据集
    Unity中的序列化和反序列化
    java计算机毕业设计权益会员管理源码+系统+mysql数据库+lw文档+部署
    TSINGSEE青犀AI智能分析网关V4工业园区/厂区/工厂智慧安监方案
    STM32MP157F-DK2 使用体验
    Bootstrap Blazor 开源UI库介绍-Table 虚拟滚动行
    verdi dump状态机的波形时直接显示状态名
    Spark之Container killed on request.Exit code is 137
    pinpoint新增自定义插件监控
  • 原文地址:https://blog.csdn.net/weixin_43662405/article/details/126372164