杭电2058

来源:互联网 发布:守望先锋好玩在哪 知乎 编辑:程序博客网 时间:2024/04/28 08:29

采用暴力法会TLE,如下列/**/ 所示   通过数列求和进行枚举‘


#include<iostream>#include<cstdio>#include<cmath>using namespace std;int main(){   int n,m;   while(scanf("%d%d",&n,&m)!=EOF){       if(n==0&&m==0)break;   int start,end; /*for(int i = 1;i<=n;i++)   {   start = i;   sum = i;   if(sum!=m){     for(int j = i+1;j<=n;j++){        sum+=j;if(sum==m){    end = j;printf("[%lld,%lld]\n",start,end);break;}else if(sum>m){    break;}   }   }else                printf("[%lld,%lld]\n",start,start);   }*/       //起始为i,个数为j的数列,(i+i+j-1)*j/2=m,所以个数j一定小于2m的开方,然后再进行枚举j<sqrt(2m)   int kk = (int)sqrt(2.0*m);   for(end = kk;end>=1;end--)   {       start = (2*m/end+1-end)/2;   if((start+start+end-1)*end/2==m)   printf("[%d,%d]\n",start,start+end-1);   }   printf("\n");   }}


0 0
原创粉丝点击