【枚举】连续自然数和(jzoj 2102)
生活随笔
收集整理的这篇文章主要介绍了
【枚举】连续自然数和(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)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 五菱宏光 MINIEV 第三代马卡龙车型
- 下一篇: 【dfs】简单游戏(jzoj 2121)