公式推导+暴力
以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; }