138 - Street Numbers//暴力or解方程

来源:互联网 发布:帝国cms采集规则下载 编辑:程序博客网 时间:2024/06/05 16:51

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



原创粉丝点击