你这么能倒是去交个题解啊
by doby @ 2016-05-24 21:25:30
这么晒代码没什么用,带点注释交个题解吧
by doby @ 2016-05-24 21:27:48
就是就是赞同楼上 @[冯豫川555](/space/show?uid=10464) 还能加贡献点
by Deny_小田 @ 2016-05-25 19:23:42
赞同,加油。
by lzhcra @ 2016-05-25 19:56:44
整个题就是反向的一个等差数列求和
给出M,有等差数列求和公式得:设区间[x,y]上M=(x+y)\*(x-y+1)/2 顺便提一下 x-y+1 为自然数个数
化简得到 y方-y=x方+x-2\*M;进一步两边同时加一个1/4 可得 (y-1/2)方=(x+1/2)方-2\*M;
于是两边开方 有y=根号下((x+1/2)方-2\*M)+1/2;
那么我们就枚举x i=1;i<=M/2;i++ 因为至少是两个数相加所以枚举到一半即可;
可以算出每一个x对应的y 只需判断其是否为整数 如果是那么合题输出一组;
下面贴出代码:
```cpp
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int m,x,y;
bool can(double x)//判断是否为整数,就不讲了,应该能看懂
{
if((int)x==x) return true;
else return false;
}
int main()
{
scanf("%d",&m);
double h;
for(int i=1;i<=m/2;i++) //枚举x
{
h=sqrt(2*m+(i-0.5)*(i-0.5))-0.5; //这就是推出的公式
if(can(h)) printf("%d %d\n",i,(int)h);
}
return 0;
}
希望有帮助!!!!233333333
```
by 冯豫川555 @ 2016-05-26 18:59:35
至于没有提解,那是因为,那坑爹的审核没有过!!!!!!我也是醉勒鸟
by 冯豫川555 @ 2016-05-26 19:01:33
P党,看不懂………………
by DONGHANG @ 2016-08-10 07:46:38
+1
by Radium_ @ 2016-08-29 18:16:31
+2
by 龙尊下凡 @ 2016-11-21 21:51:17
666
by ljhhjr2000 @ 2016-11-22 11:16:02