建站免费软件,wordpress 全文搜索,手机上的免费销售网站建设,有网站怎样做推广连续自然数和
题目大意#xff1a;
输出一个n#xff0c;求出所有相加等于n的连续自然数序列
样例输入
10000
样例输出
18 142
297 328
388 412
1998 2002
数据范围限制
10 M 2,000,000
解题思路#xff1a;
这道题的正解的时间复杂度是o(2n)o\left …连续自然数和
题目大意
输出一个n求出所有相加等于n的连续自然数序列
样例输入
10000
样例输出
18 142
297 328
388 412
1998 2002
数据范围限制
10 M 2,000,000
解题思路
这道题的正解的时间复杂度是o(2n)o\left ( \sqrt{2n} \right )o(2n)但因为我太蒟了所以只用了o(n/2)o\left ( n/2 \right )o(n/2)的方法o(n/2)o\left ( n/2 \right )o(n/2)的方法就是先枚举2~n/21然后把这些数字当做奇数序列的中心若可以被n整除就往左右两边分别扩(n/i-1)/2个数字首先把自己的那一份去掉在平分两边,然后把两个数字的和当做偶数数列的中心若可以被整除就往左右分别扩n/ii-1-1个数字前面是两个相连的数然后去掉一份因为他的一份是两个数字所以*2/2抵消
#includecstdio
#includeiostream
#includecstring
using namespace std;
int n,l;
int main()
{scanf(%d,n);for (int i2;in/21;i)//一半以上是不可能的但要到n/21例如5可以23n/21{if ((n%i0)((n/i)1))//奇数数列判断是否整除和是否有奇数份{l(n/i-1)/2;//往两边扩if (ililn)//判断是否出界printf(%d %d\n,i-l,il);}if (n%(ii-1)0)//判断是否整除{ln/(ii-1)-1;//往两边扩if(il1iln)//判断是否出界printf(%d %d\n,i-l-1,il);//i-1占了一个位}}return 0;
}