题目大意
给出一个数 X ,求出所有的n,使得$ \sqrt{n^2+n+X} $ 是一个整数
解题思路
不难发现,n一定是个整数
因为$ \sqrt{n^2+n+X} $ 是一个整数,所以我们可以把n2+n+X用(n+m)2表示出来(其中m是一个整数)
所以,n+X=n2+n+X−n2=(n+m)2−n2=2nm+m2
所以 X−m2=2nm−n=(2m−1)n
我们可以考虑枚举m,判断2m−1X−m2是否是一个整数,如果是的话,就说明n是个整数,最后统计完之后排序去重就可以了。
时间复杂度分析
因为−1014≤X≤1014,所以$ \sqrt{n^2+n+X} $最大约是107,所以n+m最大值也约是107,所以m的最大值也大概是107
AC Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include<bits/stdc++.h> using namespace std; #define int long long const int INF=2e7+10; int x; vector<int> ans; signed main(){ cin>>x; for(int i=0;i<=INF;i++){ if((x-i*i)%(2*i-1)==0) ans.push_back((x-i*i)/(2*i-1)); i=-i; if((x-i*i)%(2*i-1)==0) ans.push_back((x-i*i)/(2*i-1)); i=-i; } sort(ans.begin(),ans.end()); ans.erase(unique(ans.begin(),ans.end()),ans.end()); cout<<ans.size()<<endl; for(auto i:ans) cout<<i<<' '; return 0; }
|