【枚举】连续自然数和(jzoj 2102)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                【枚举】连续自然数和(jzoj 2102)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
                                連續(xù)自然數(shù)和
題目大意:
輸出一個(gè)n,求出所有相加等于n的連續(xù)自然數(shù)序列
樣例輸入
10000
樣例輸出
18 142
297 328
388 412
1998 2002
數(shù)據(jù)范圍限制
10 <= M <= 2,000,000
解題思路:
這道題的正解的時(shí)間復(fù)雜度是o(2n)o\left ( \sqrt{2n} \right )o(2n?)但因?yàn)槲姨X了,所以只用了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然后把這些數(shù)字當(dāng)做奇數(shù)序列的中心,若可以被n整除,就往左右兩邊分別擴(kuò)(n/i-1)/2個(gè)數(shù)字(首先把自己的那一份去掉在平分兩邊),然后把兩個(gè)數(shù)字的和當(dāng)做偶數(shù)數(shù)列的中心,若可以被整除,就往左右分別擴(kuò)n/(i+i-1)-1個(gè)數(shù)字(前面是兩個(gè)相連的數(shù),然后去掉一份,因?yàn)樗囊环菔莾蓚€(gè)數(shù)字,所以*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))//奇數(shù)數(shù)列判斷是否整除,和是否有奇數(shù)份{l=(n/i-1)/2;//往兩邊擴(kuò)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;//往兩邊擴(kuò)if(i>l+1&&i+l<n)//判斷是否出界printf("%d %d\n",i-l-1,i+l);//i-1占了一個(gè)位}}return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【枚举】连续自然数和(jzoj 2102)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 五菱宏光 MINIEV 第三代马卡龙车型
- 下一篇: vivo 预热 OriginOS 4:支
