先bs下自己吧。这道题可以先打表,在提交。
刚开始写的二分有点问题,我先找到的是n,然后再找m。其实是先找到m,然后再找n。
另一种解法是解方程,解佩尔方程。
不管是暴力还是解方程都要先找出表达式。由题意可得n*(n+1)/2=x*(x+1)/2-n*(n+1)+n;化简可得n*n/2=x*x+x。然后将其变形为标准的佩尔方程,然后再用递推求解。
下面是二分的代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int n=~(unsigned int)0/2;
int main()
{
int t=0;
for(long long i=6;i<n&&t<=10;i++)
{
long long min=1;
long long max=i+1;
long long mid;
while(min<=max)
{
mid=(min+max)/2;
if(mid*mid*2==i*(i+1))
{
printf("%10lld%10lld\n",mid,i);
t++;
break;
}
else if(mid*mid*2>i*(i+1)) max=mid-1;
else min=mid+1;
}
}
return 0;
}
结果需要3分钟左右才能求出10组解。囧.....
下面是解方程的代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int x3,y3;
for(int x1=1,y1=1,x2=1,y2=1,t=0;t<10;t++)
{
x3=(2*x1+1)*(2*x2+1)+8*y1*y2;
y3=(2*x1+1)*y2+y1*(2*x2+1);
printf("%10d%10d\n",y3,(x3-1)/2);
x2=(x3-1)/2;
y2=y3;
}
return 0;
}