题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2058
题目大意:
求1~n中和等于m的子序列
题解:
sub(a,b)为a到b序列的和,由高斯公式 sub(a,b)=(b+a)*(b-a+1)/2
假设输入为 20 10
m=10, 2*m的因式 x*y 有 4*5 2*10 1*20
由y=b+a;x=b-a+1;即可求得a,b的值。
(这题n压根不用考虑就能AC)
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m),n+m)
{
int i;
m=2*m;
for(i=(int)sqrt((double)m);i>=1;i--)
{
int x,y;
int a,b;
if(m%i==0)
{
y=i>(m/i)?i:(m/i);
x=i<(m/i)?i:(m/i);
if((x+y-1)%2==0&&(y-x+1)%2==0)
{
a=(y-x+1)/2;
b=(x+y-1)/2;
printf("[%d,%d]\n",a,b);
}
}
}
printf("\n");
}
return 0;
}