博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

codeforces 599D

Posted on 2016-04-22 13:15  shaoweiyi  阅读(239)  评论(0编辑  收藏  举报

公式推导+暴力

 

以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;
}