您的位置:首页 > 其它

51Nod 1138 连续整数的和

2018-01-27 15:39 225 查看


这道题 我列一个方程是 一开始是

x 首项 y 末项 n 所给数


(x+y)∗(y−x+1)=2n

分解

y2−x2+x+y=2n

发现很难解 因为上下限超过了

N=1e9 时间1s O(logn)不能再多了

然后就换了一个思路

x 首项 n 项数 N 所给数


(x+x+n−1)∗n=2N

这样解 就方便不少 因为少了一个二次方项

分解

x=2N−n2+n2n

如果x是整数 那么x和n便是我们的答案

这样我们只要确定n项数就能确定x了 因为不会产生多解

再想想n最多能多大 那肯定是从1开始 那就是

(1+n−1)∗n=2N

n最大为2N−−−√

O(N−−√)也不差

然后放到set中自动维护大小算完时 一并搞出来即可

#include<iostream>
#include<set>
#include<cmath>
using namespace std;
int main(){
int n;
cin >> n;
set<int> s;
int lim = sqrt(n*2);
for(int i=2;i<=lim;i++){
double ans = (double)(2*n+i-i*i)/(2*i);
//      cout << ans << endl;
if((int)ans==ans) s.insert((int)ans);
}
if(s.empty()){
cout <<"No solution" << endl;
return 0;
}
set<int> ::iterator iter = s.begin();
while(iter!=s.end()){
cout << *iter << endl;
iter++;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: