欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【枚举】连续自然数和(jzoj 2102)

发布时间:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【枚举】连续自然数和(jzoj 2102) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

连续自然数和

题目大意:

输出一个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/2+1然后把这些数字当做奇数序列的中心,若可以被n整除,就往左右两边分别扩(n/i-1)/2个数字(首先把自己的那一份去掉在平分两边),然后把两个数字的和当做偶数数列的中心,若可以被整除,就往左右分别扩n/(i+i-1)-1个数字(前面是两个相连的数,然后去掉一份,因为他的一份是两个数字,所以*2/2抵消)

#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,l; int main() {scanf("%d",&n);for (int i=2;i<=n/2+1;i++)//一半以上是不可能的,但要到n/2+1例如5可以2+3(n/2+1){if ((n%i==0)&&((n/i)&1))//奇数数列判断是否整除,和是否有奇数份{l=(n/i-1)/2;//往两边扩if (i>l&&i+l<n)//判断是否出界printf("%d %d\n",i-l,i+l);}if (n%(i+i-1)==0)//判断是否整除{l=n/(i+i-1)-1;//往两边扩if(i>l+1&&i+l<n)//判断是否出界printf("%d %d\n",i-l-1,i+l);//i-1占了一个位}}return 0; } 创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的【枚举】连续自然数和(jzoj 2102)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。