这道题我很悲剧,悲剧的是不会做,悲剧的是别人告诉我怎么做后,我依旧错了。
看看题目,其实看不出什么名堂,也没感觉他有什么,我第一方法就是数的枚举
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int N,i,j;
bool flag;
cin>>N;
flag=true;
for(i=1;i<N;i++)
for(j=i+1;j<N;j++)
if((i+j)*(j-i+1)/2==N){
printf("%d\n",i);
flag=false;
break;
}
else if((i+j)*(j-i+1)/2>N)
break;
if(flag)
printf("No Solution\n");
}
果断超时,做了半天没过,找大神,大神果然是大神,几位大神,连停顿都没停顿,说枚举长度,
(x+x+L-1)*L=2*S
长度L小于等于sqrt(2*S) x=((2*s)/L+1-L)/2;写了几次才水过
#include<stdio.h>
#include<math.h>
int main()
{
int n,L,i,s;
bool flag=true;
scanf("%d",&n);
n=2*n;
L=sqrt(n);
for(i=L;i>=2;i--)
{
s=(n/i-i+1);
if(n%i==0&&s%2==0)
{printf("%d\n",s/2);flag=false;}
}
if(flag)
printf("No Solution\n");
}