【枚举】连续自然数和(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)