示例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 ...