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++; } }
相关文章推荐
- 51Nod 1138 连续整数的和(数学、规律)
- 51nod 1138 连续整数的和
- 51nod 1138 连续整数的和(数学)
- 51Nod 1138 连续整数的和
- 51nod 1138 连续整数的和(简单数学、等差数列)
- 【51Nod】1138 连续整数的和
- 51nod 1138 连续整数的和 (数学公式_转换思想,好题吧)
- 51nod 1138 连续整数的和
- 【51nod】--1138 连续整数的和 (思维)
- 51nod 1138 连续整数的和(数学公式)
- 51nod 1138 连续整数的和(等差数列)
- 51nod--1138 . 连续整数的和
- 51nod--1138 . 连续整数的和
- 51Nod-1138-连续整数的和
- 51NOD 1138 连续整数的和
- 51nod 1138 连续整数的和
- 51nod 1138 连续整数的和 (规律)
- 51nod 1138 连续整数的和(数学)
- 51nod 1138 连续整数的和(牛逼)
- 51Nod 1138 连续整数的和