• codeforces 599D


    公式推导+暴力

    以26为例

    1*26

    2   2*m+1*(m-1)=s2*m+t2

    3   3*m+2*(m-1)+(m-2)=s3*m+t3

    4   4*m+3*(m-1)+2*(m-2)+(m-3)=s4*m+t4

    做减法可知 t4-t3=1+2+3+4

                  t3-t2=1+2+3

                  t2-t1=1+2

    而 si=1+2+..+i;

    tn与tn-1的差是sn-1  sn与sn-1的差是n

    i    s  t

    1

    2  3  1

    3  6  4

    4 10 10

    5 15 20

    同时,根据经验i不会超过2000000;

    AC代码

    #include <iostream>
    #include<algorithm>
    #include<cstdio>
    
    using namespace std;
    
    long long a[2000001];
    long long b[2000001];
    long long x;
    long long s,t;///tn与tn-1的差是sn-1  sn与sn-1的差是n
    int main()
    ///输入顺序,相等时的处理,为1时的处理
    ///截止条件错误终止条件考虑不周
    ///像这种倒叙输出的题目 都要考虑下相等的问题
    {
    while(cin>>x)
    {
    if(x==1)
    {
        cout<<"1"<<endl<<"1 1"<<endl;
        continue;
    }
    s=3;
    t=1;
    int ans=1;
    int temp=2;
    int flag=0;
    for(long long i=2;i<=2000000;++i)
    {
        if(!((x+t)%s ) )
        {
            a[temp]=i;
            long long tt=(x+t)/s;
            b[temp++]=tt;
            if(i==tt) flag=1;
            if(i>tt) break;
        ans++;
        }
        t+=s;s+=i+1;
    
    }
    if (!flag)
    cout<<2*ans<<endl;
    else cout<<2*ans-1<<endl;
    cout<<"1 "<<x<<endl;
    if(ans>=2)
    {
    for(int i=2;i<=ans;++i)
    {
        cout<<a[i]<<" "<<b[i]<<endl;
    }
    
    for(int i=ans;i>=2;--i)
    {
    if(flag&&i==ans) continue;
    cout<<b[i]<<" "<<a[i]<<endl;
    }
    }
    
    cout<<x<<" 1"<<endl;
    
    
    }
    
    
    
    return 0;
    }
  • 相关阅读:
    sweetalert 1.0多次回调函数bug
    ThinkPHP添加扩展配置失败
    记一次相机内存卡数据恢复
    流量监控脚本监控网卡
    ip网关配置
    centos7【防火墙】常用规则-docker服务防火墙规则
    ssh服务及安全配置
    代码库
    linux计划任务防暴力破解脚本+免密操作
    阿里去短信接口包
  • 原文地址:https://www.cnblogs.com/weiweiyi/p/5420923.html
Copyright © 2020-2023  润新知