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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 4321 Contest 3

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 4321 Contest 3 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給定a和b,n,讓你求b+a, b+2*a, .......b+n*a里面有多少1.

?

當統計第K位的時候 可以注意到 第 B+T*A 和 B+(T+2^(K+1))*A 位是相同的

那么 第K位的時候 只需要統計2^(K + 1) ?- 1次就可以了

當統計第K位的時候 可以注意到 連續的 (2^K)/A都是連續的0 或者連續的1 所以可以考慮直接連續記錄(2^K)/A個結果。

那么 第K位的時候 只需要統計N / ((2^K)/A)次就可以了
那么 第K位的時候 只需要統計 2^K/((2^K)/A) 復雜度 變為O(A)

?

以上是題解。當然,第一部分很容易想到,但是那個優化我沒想到。。。。其實是個很簡單的優化了吧。如,當統計第K位時,第K位后面的數字決定了有多少個連續的第K位的相同的數字。最大是到后面的數字全為1。所以,只需統計到最大為全1的情況即可,當然是可以小于的。這就很容易理解了。也算是一種常用的技巧了,但做的時候竟然沒想到。。。

#include <iostream> #include <string.h> #include <stdio.h>using namespace std; typedef long long LL;void Solve(LL a,LL b,LL n) {LL cnt=0;LL max=b+a*n;for(LL i=0;i<64;i++){LL m=(LL)1<<i;LL mm=m;if(m>max) break;m<<=1;LL cur=a+b;LL j=0;while(j<m&&j<n){LL step=((mm-1)-cur&(mm-1))/a+(LL)1;if(j+step>=n) step=n-j;if(j+step>=m) step=m-j;if(cur&(LL)1<<i){cnt+=step*(n/m);if(j+step<(n%m)) cnt+=step;else if(j<(n%m)) cnt+=(n%m)-j;}cur+=a*step;j+=step;}}cout<<cnt<<endl; }int main() {int t,k=1;LL a,b,n,i,j;cin>>t;while(t--){cin>>a>>b>>n;cout<<"Case #"<<k++<<": ";Solve(a,b,n);}return 0; }

  

轉載于:https://www.cnblogs.com/jie-dcai/p/4085313.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的HDU 4321 Contest 3的全部內容,希望文章能夠幫你解決所遇到的問題。

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