标签:1138 No 51nod 好题 long int flag 写为 include
给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2)。例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8。如果不能写为若干个连续整数的和,则输出No Solution。
收起
输入
输入1个数N(3 <= N <= 10^9)。
输出
输出连续整数中的第1个数,如果有多个按照递增序排列,如果不能分解为若干个连续整数的和,则输出No Solution。
输入样例
15
输出样例
1
4
7
分析:
假设[a,a+k-1]满足和=n
a,a+1, a+2,……a+k-1
k*a+k*(k-1)/2=n
k^2+(2*a-1)k-2n=0
这题一开始想的暴力枚举a,
k=【(1-2a)+(long long)(2*a-1)*(long long)(2*a-1)+8*n】/2
果断的T了
这题需要转化一下啊思想
枚举k
k^2+k=2n
取a=1,k可以取到最大不超过sqrt(2*n)
即k的取值范围(2,sqrt(2*n))
超时代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int flag=1;
for(int a=1;a<=n/2;a++)
{
double x=(long long)(2*a-1)*(long long)(2*a-1)+8*n;
x=sqrt(x);
if(x==(int)x)
{
if(((int)x+1-2*a)%2==0)
{
printf("%d\n",a);
flag=0;
}
}
}
if(flag==1)
printf("No Solution\n");
}
return 0;
}
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int flag=1;
for(int k=sqrt(2*n);k>=2;k--)
{
if((2*n+k-k*k)%(2*k)==0)
{
printf("%d\n",(2*n+k-k*k)/(2*k));
flag=0;
}
}
if(flag==1)
printf("No Solution\n");
return 0;
}
标签:1138,No,51nod,好题,long,int,flag,写为,include 来源: https://blog.csdn.net/sdz20172133/article/details/89381665
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。