牛客多校 Ternary String (數論)

2021-08-21 20:57:18 字數 1694 閱讀 8375

示例1輸入複製3

000012

22輸出複製3

9345

思路:1. 如果遇到了 0, t++

2. 如果遇到了1,t = t*2+2

因為之前經歷了t,那麼就會派生出來t個0,加上乙個1的時間 2 就是上式了

3. 如果遇到了2,t = 3*(2^t -1) 

可以類似於2來想,經過了t後到了乙個2

會變成這樣 21101001000100001.......

再過一秒會變成1101001000100001000001.......   // **** 等了一秒

觀察這個序列可以發現:該序列滿足2的結論 。

消滅到第乙個1和他後面的0  需要  a1 = 2

消滅到第二個1和他後面的0  需要  a2 = 2*a1+2 + 2-1 = 7 

消滅到第三個1和他後面的0  需要  a3 = 2*a2+2 + 3-1 = 18

消滅到第 i 個1和他後面的0  需要  a[i] = 2*a[i-1]+2+i-1 = 2*a[i-1]+i+1

有了 a[i+1] = 2*a[i]+i+2,a[1] = 2, 就可以求a[n] 了

兩邊同時加 i+4 得到  a[i+1]+(i+1)+3 = 2(a[i]+i+3)

令b[n] = a[n]+n+3 , b1 = a1+4 = 6;

b[n+1]/b[n] = 2;  

得到 b[n] = 6*2^(n-1) = 3*2^n

得到 a[n] = b[n]-n-3 = 3*2^n-n-3

a[n] 就是在之前時間為n-1 (因為之前等了一秒)時,當前2消掉的花費了。

再加上之前的花費n-1 + 1可以算出總的當前花費 3*2^n-3

那麼由於每次都要對前面的結果取一次指數,就得用指數迴圈節了

1e9+7 開始打個表,20多次phi就能打到1了·剩下的就是維護指數,和結果了

倒存一下mod,正向一遍出結果。

#include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e5+7;

char s[maxn];

stack mod;

ll qm(ll a, ll n, ll m)

a = a*a;

if(a >= m) a= a%m+m;

n/=2;

} return ans;

}map phi;

ll get_phi(ll n)

if(n!=1) ans = ans-ans/n;

return ans;

}int main()

int t;

scanf("%d",&t);

while(t--)

}ll ans = 0;

ll tmp = 0;

ll mod = 1e9+7;

if(mod.empty()) mod.push(mod);

for(int i = 0; s[i]; i++)

if(s[i] == '1')

if(s[i] == '2')

}printf("%lld\n",ans);

} return 0;

}

牛客多校 Playing games FWT

給出 n n 個數a1 a2,an role presentation style position relative a1,a2,a na1,a2,a n,問最多選出多少個數使得這些數的異或和為0。n,ai 5 105 n,a i 5 105 震驚!老年退役選手居然開始寫題解了。這次回家本來也沒打...

牛客 多校賽一

a lgv演算法 抄一波 牛客的解釋 wiki 沒耐心看了 lgv 演算法 lindstr m gessel viennot lemma 求以上矩陣的行列式,其中 e a,b 是從a到b的方法數,帶入求行列式即可得到 a1,a2,an 到 b1,b2,bn 的所有不相交路徑的種數 再看這道題,其實就...

2018牛客多校3

h diff prime pairs 1 3 1 5 1 7 1 11.2 3 2 5 2 7 2 11.3 3 3 5 3 7 3 11.4 3 4 5 4 7 4 11.打個素數表 用素數篩一遍 includeusing namespace std bool a 11111111 int zs ...