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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces - 1295B Infinite Prefixes(数学)

發布時間:2024/4/11 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1295B Infinite Prefixes(数学) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一個由0或1組成的字符串s,用來構造出字符串 t =? s?+ s + s....+ s,字符串 t 由無限個 s 拼接而成?,F在規定cnt_0 [ i ]和cnt_1 [ i ]分別為到第 i 位為止所出現的0和1的個數,給出一個 x ,問字符串 t 中有多少個前綴滿足cnt_0 [ i ] - cnt_1 [ i ] == x,若有無限個答案,輸出-1

題目分析:簡單到不能在簡單的數學題了,但是比賽的時候腦子瓦特了,一直處理不了細節,加上讀題的時候就把心態讀崩了,正所謂是半小時讀題,一秒鐘出正解,一小時debug,然后交上去1WA,心態直接炸裂,完成掉分

讀完題后,第一反應應該是有一個公式的,因為字符串 t 是由字符串 s 無限循環而得到的,每次循環后都必定會有數字0和數字1差值積累的貢獻,比如字符串101,每循環一次所積累的差值為 -1 ,循環100次積累的差值就是 -100 ,所以我們可以分為兩類,一類是可以積累貢獻的,另一類是不能積累貢獻的(也就是0的個數和1的個數相同時),當然輸出-1的情況顯然在不能積累貢獻的情況中,我們假設找到?x 時是在第 k 次循環,那么有公式:

k * ( cnt_0 [ n ] - cnt_1 [ n ] ) + ( cnt_0 [ i ] - cnt_1 [ i ] ) == x?

移項處理得到:

k * ( cnt_0 [ n ] - cnt_1 [ n ] ) == x -?( cnt_0 [ i ] - cnt_1 [ i ] )

滿足上述條件的 i 就是我們所要找的答案了,需要滿足兩個條件:

  • 因為積累貢獻的 k 是從 0 開始的,所以第一個條件為(x -?( cnt_0 [ i ] - cnt_1 [ i ] )) /?( cnt_0 [ n ] - cnt_1 [ n ] ) >=0
  • 其次就是 (x -?( cnt_0 [ i ] - cnt_1 [ i ] )) %?( cnt_0 [ n ] - cnt_1 [ n ] ) == 0
  • 當然眾所周知 0 不能作為除數出現,所以要分類討論一下( cnt_0 [ n ] - cnt_1 [ n ] ) == 0時的情況,也就是不能積累貢獻的情況,還有空串的情況也需要特判

    代碼:

    #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<set> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int cnt[N];char s[N];int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n,x;scanf("%d%d%s",&n,&x,s+1);for(int i=1;i<=n;i++){cnt[i]=cnt[i-1];if(s[i]=='0')cnt[i]++;elsecnt[i]--;}int ans=0;if(x==0)//特判空串 ans++;for(int i=1;i<=n;i++){if(cnt[n]==0)//每次循環貢獻為0 {if(cnt[i]==x)ans++;}else//每次循環都有貢獻 {if((x-cnt[i])%cnt[n]==0&&(x-cnt[i])/cnt[n]>=0)ans++;} }if(cnt[n]==0&&ans)//特判無限ans=-1;printf("%d\n",ans);}return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的CodeForces - 1295B Infinite Prefixes(数学)的全部內容,希望文章能夠幫你解決所遇到的問題。

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