日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

亿阳信通:不可表示的数

發(fā)布時間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 亿阳信通:不可表示的数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前些日子在網(wǎng)上發(fā)現(xiàn)一道編程題目,引用如下:

題目詳情:

本題的獎品由億陽信通贊助,以下是題目詳情:

給定表達式[x/2] + y + x * y, 其中x,y都是正整數(shù)。其中的中括號表示下取整,例如[3/2] = 1 , [5/2] ?= 2。

有些正整數(shù)可以用上述表達式表達出來,例如正整數(shù)2,當(dāng)取x = y = 1時,可以把2表達出來

( 解釋下:當(dāng)x=y=1時, [x / 2] + y + x * y = [1 / 2] + 1 + 1 * 1 = 0+1+1 = 2 );

有些數(shù)可以有多種方式表達,例如13可以由 x = 2 y = 4 以及x = 3 y = 3來表示;

有些數(shù)無法用這個表達式表達出來,比如3。

從1開始第n個不能用這個表達式表示出來的數(shù),我們叫做an,例如a1=1 a2=3,給定n,求an。


輸入:n值 1<=n<=40

輸出:an % 1000000007的結(jié)果(因為結(jié)果較大,輸出an %1000000007的結(jié)果)。


函數(shù)頭部

C/C++:

int givean(int n);

java:

public class Main {

? ? ? public static int givean(int n) {

? ? }

}

答題說明:

main函數(shù)可以不用完成,完成givean函數(shù)即可,givean函數(shù)外可編寫其它函數(shù)。


=================================================================================================


一時興起,就嘗試解答此題,思路:使用二重循環(huán)窮舉法來判斷一個數(shù)是不是不可表示的數(shù)。

我的代碼:

public static int givean(int n){if (n < 1 || n > 40){return -1;}long i = 0;while (n > 0){i++;if (isUndisplayNumber(i)){n--;}}return (int) (i % 1000000007);}/*** 判斷n是否為不可表示數(shù)* * @param n* @return*/private static boolean isUndisplayNumber(long n){if (n == 1 || n == 3){return true;} else if (n % 2 == 0){return false;}for (long i = 1; i <= n; i++){for (long j = 1; j <= n; j++){long m = i / 2 + j + i * j;if (m > n){break;}if (m == n){return false;}}}return true;}

編譯和測試結(jié)果顯示正常(其實givean(6)運行已經(jīng)超時,超過100s),提交結(jié)果:

抱歉,處理您的請求時出錯。
知道這是因為我的窮舉法太費時了,嘗試了幾種優(yōu)化方案,但效果都不明顯。在此標(biāo)記,以備后學(xué)!

=========================================================================================================================

備注:

后來利用搜索引擎在開心問答網(wǎng)上搜到一篇相關(guān)文章(http://www.kaixinwenda.com/article-lzc52151-9957839.html),分析如下:

推導(dǎo):

1、? 對[x/2] + y + x * y分析,試探:x=1,原式=2y,表示所有偶數(shù),即對所有偶數(shù)都能用此式表示,故后文重點討論哪些奇數(shù)不能被其表示(本文討論的所有奇偶數(shù)都為非負數(shù))。

2、? 對x分為4n,4n+1,4n+2,4n+3四種情況討論。

容易得到,x=4n+1時,不論y取何值,原式必為偶數(shù),與1)中情況重復(fù),故舍去不討論;

x=4n時,y=2m+1才能保證原式為奇數(shù),其中要保證n>0;

x=4n+2時,y=2m才能保證原式為奇數(shù),其中要保證m>0;

x=4n+3時,y=2m或2m+1都能使原式為奇數(shù);

故只討論后三種情況。

3、? 把x=4n,y=2m+1代入原式易得2(m+n)+8mn+4n+1、n>0;

把x=4n+2,y=2m代入原式易得2(m+n)+8mn+4m+1、m>0;

明顯,這兩種情況可表示的奇數(shù)是相同的,故只需研究其中一種即可。

總結(jié)一下,目前已知原式對所有偶數(shù)可表示,對哪些奇數(shù)可表示呢?我們要研究的情況只有兩種x=4n+2(即x=4n)與x=4n+3時的情況。

4、? 對x=4n+2時,不限制y的奇偶性,此情況下,原式可表示為2n+3y+4ny+1;

對x=4n+3時,不限制y的奇偶性,,此情況下,原式可表示為2n+4y+4ny+1;

下面我們重點討論這兩種情況表示的奇數(shù)包括哪些。

5、? 對x=4n+3,原式=2n+4y+4ny+1=2(n+1)(2y+1)-1,即表示一個奇數(shù)(2y+1)的偶數(shù)倍減1。也就是說x=4n+3情況時,表示的奇數(shù)都具備一個特征:這個奇數(shù)可以寫成一個奇數(shù)的偶數(shù)倍減1。

故我們可以得到下面的結(jié)論:在x=4n+3的情況下,如果偶數(shù)B能寫成一個奇數(shù)的偶數(shù)倍,即奇數(shù)與偶數(shù)的乘積,那么奇數(shù)A=B-1可以被原式表示。

其逆否命題:在x=4n+3的情況下,奇數(shù)A=B-1不可以被原式表示,則偶數(shù)B不能寫成奇數(shù)與偶數(shù)的乘積,即其因子分解只能寫成偶數(shù)與偶數(shù)的乘積。

一個偶數(shù)因子分解只能寫成偶數(shù)與偶數(shù),只有2的冪了。

故得到結(jié)論:在x=4n+3的情況下,不可以被原式表示的奇數(shù)都是2的冪減1。

6、? 對x=4n+2,原式=2n+3y+4ny+1=[(4n+3)(2m+1)-1]/2,即表示兩個奇數(shù)的積減1的差的一半。也就是說x=4n+2情況時,表示的奇數(shù)都具備一個特征:這個奇數(shù)可以寫成兩個奇數(shù)的積(4n+3)(2m+1)減1的差的一半。

換句話說,在x=4n+2的情況下,原式所能表示的奇數(shù)A都可以寫成兩個奇數(shù)的積減1的差的一半。反過來,2A+1必定能寫成兩個奇數(shù)的積。

而對任意的2A+1必為奇數(shù),它要么能寫成兩個奇數(shù)的積要么是素數(shù)。

故得到結(jié)論:在x=4n+2的情況下,不可以被原式表示的奇數(shù)A都是某個素數(shù)減1的差的一半。

7、? 把1)、5)與6)的結(jié)論綜合起來,對任意正整數(shù)x、y,如果不能被原式表示,它必定是奇數(shù),這個奇數(shù)必定是2的冪減1,同時是某個素數(shù)減1的差的一半。

用形式化語言表達,對任意正整數(shù)x、y,不能被[x/2] + y + x * y表示的數(shù),必定可以寫成2^p-1,且2^(p+1)-1是一個素數(shù)。

8、? 于是我們得到這個問題的解答:an中的元素都滿足2^p-1且2^(p+1)-1是素數(shù)。

--------------------------------------------------------------------------------------

編程求解:

問題從數(shù)學(xué)上已經(jīng)解決了,并得到了一個漂亮的解答。但如何求2^p-1,還要判斷2^(p+1)-1是否為素數(shù),這都是非常困難。

一步步來,求素數(shù),傳統(tǒng)方法當(dāng)然是素性檢測,以前寫過一個拉賓米勒測試,很復(fù)雜。但突然意識到對2^p-1如果是素數(shù)的話,數(shù)論被叫做梅森素數(shù),前人肯定有總結(jié)。

百度一下,前40個梅森素數(shù)的冪指數(shù)(p+1)取值為:2,3,5,7,13,17,19,31,61,89,107,127,521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213,19937,21701,23209,44497,86243,110503,132049,216091,756839,859433,1257787,1398269,2976221,3021377,6972593,13466917,20996011。

有了梅森素數(shù),只要求相應(yīng)的2^p-1即可。素數(shù)的問題是解決了,但2^20996011是個什么概念,天文數(shù)字,再強大計算機一時半會兒也算不出來。幸好題目是拿an對1000000007取模。通過模運算可以簡化問題。

模運算(2^p-1)%N=(2^p%N-1)%N,在這里等于2^p%N-1。但下面一個問題來了2^p%N怎么求?

2^p%N是一個龐大的數(shù),傳統(tǒng)的方法是遞歸,無論從空間還是時間上來說都不解決問題。幸好往日有積累,對這種變態(tài)需求,當(dāng)然有特殊手段。運用蒙哥馬利算法可以迅速解決,秒殺之。

最后得到an的前40個數(shù):1,3,15,63,4095,65535,262143,73741816,536396503,140130950,487761805,319908070,106681874,373391776,317758023,191994803,416292236,110940209,599412198,383601260,910358878,532737550,348927936,923450985,470083777,642578561,428308066,485739298,419990027,287292016,202484167,389339971,848994100,273206869,853092282,411696552,876153853,90046024,828945523,697988359。

提交代碼的時候,寫成枚舉,成功!




總結(jié)

以上是生活随笔為你收集整理的亿阳信通:不可表示的数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。