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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F- 1 + 2 = 3? (好难的找规律题)

發布時間:2024/4/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F- 1 + 2 = 3? (好难的找规律题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

斐波那契真的牛掰

題目鏈接

題目描述:

小Y在研究數字的時候,發現了一個神奇的等式方程 ,他屈指算了一下有很多正整數x滿足這個等式,比如1和2,現在問題來了,他想知道從小到大第N個滿足這個等式的正整數,請你用程序幫他計算一下。
(表示按位異或運算)

輸入描述:

第一行是一個正整數 T<=100,表示查詢次數。
接著有T行,每行有一個正整數N(N<=1e12),表示小Y的查詢。
輸出描述::
對于每一個查詢N,輸出第N個滿足題中等式的正整數,并換行。
示例1

輸入:

4
1
2
3
10

輸出:

1
2
4
18

打表列出前100個數,找下規律

#include<bits/stdc++.h> #define ll long long #define N 100005 int inf = 0x3f3f3f3f; using namespace std; string solve(int n){ //將十進制轉換成二進制 string s;char c;while(n){c = '0' + n % 2;s = c + s;n /= 2;}return s; } int main (){ int now=0; printf("查詢次數 答案 二進制形式\n"); for(int i=1;;i++){if(((i ^ (2 * i)) == 3 * i)){string s;int n;s = solve(i);printf("%4d%6d ",++now,i);cout << s << endl;} if(now == 100)break;} return 0; } 查詢次數 答案 二進制形式1 1 1 //二進制1位的有1個 2 2 10 //二進制2位的有1個 3 4 100 4 5 101 //二進制3位的有2個5 8 10006 9 10017 10 1010 //二進制4位的有3個8 16 100009 17 1000110 18 1001011 20 1010012 21 10101 //二進制5位的有5個13 32 100000 14 33 10000115 34 10001016 36 10010017 37 10010118 40 10100019 41 10100120 42 101010 //二進制6位的有8個21 64 1000000 22 65 100000123 66 100001024 68 100010025 69 100010126 72 100100027 73 100100128 74 100101029 80 101000030 81 101000131 82 101001032 84 101010033 85 1010101 //二進制7位的有13個34 128 1000000035 129 1000000136 130 1000001037 132 1000010038 133 1000010139 136 1000100040 137 1000100141 138 1000101042 144 1001000043 145 1001000144 146 1001001045 148 1001010046 149 1001010147 160 1010000048 161 1010000149 162 1010001050 164 1010010051 165 1010010152 168 1010100053 169 1010100154 170 1010101055 256 10000000056 257 10000000157 258 10000001058 260 10000010059 261 10000010160 264 10000100061 265 10000100162 266 10000101063 272 10001000064 273 10001000165 274 10001001066 276 10001010067 277 10001010168 288 10010000069 289 10010000170 290 10010001071 292 10010010072 293 10010010173 296 10010100074 297 10010100175 298 10010101076 320 10100000077 321 10100000178 322 10100001079 324 10100010080 325 10100010181 328 10100100082 329 10100100183 330 10100101084 336 10101000085 337 10101000186 338 10101001087 340 10101010088 341 10101010189 512 100000000090 513 100000000191 514 100000001092 516 100000010093 517 100000010194 520 100000100095 521 100000100196 522 100000101097 528 100001000098 529 100001000199 530 1000010010100 532 1000010100

找規律:

  • 答案對應的二進制的位數符合斐波那契數,(打表斐波那契)
  • N和斐波那契的有關,給定一個N可以判斷,此時答案的二進制位數。(打表斐波那契的和)
  • 舉一個例子:當N等于70,答案的二進制為:100100010,根據打表的斐波那契的和,可以判斷答案的二進制是9位(55對應1000000000),余下的100010,剛好是N-55的二進制。遞推!
  • 代碼實現:

    #include<bits/stdc++.h> #define ll long long #define N 100005 int inf = 0x3f3f3f3f; ll f[N],sum[N],ans[N]; using namespace std; int main (){ f[1] = f[2] = 1;sum[1] = 1; sum[2] = 2;for(int i = 3; i <= 60; i++){ //打表斐波那契、斐波那契的和 f[i] = f[i-1] + f[i-2];sum[i] = sum[i-1] + f[i]; }int t;cin>>t;while(t--){ll n;cin>>n;ll ans=0;while(n){for(int i = 1; i <= 60; i ++){if(n <= sum[i] && n > sum[i-1]){ //找到n對應答案的二進制位數 ans += 1LL << i-1;n -= sum[i-1] + 1LL;//ans += (ll) pow(2, i-1LL);//pow前面要加longlong要不然會爆數據 break;}} }cout<<ans<<endl; }return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F- 1 + 2 = 3? (好难的找规律题)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。