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 就是我們所要找的答案了,需要滿足兩個條件:
當然眾所周知 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(数学)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gym - 102361A Angle
- 下一篇: CodeForces - 1295C O