CodeForces 1065E. Side Transmutations 计数
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                CodeForces 1065E. Side Transmutations 计数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                昨天不該早點走的....
?
首先操作限制實際上是一個回文限制
每個$b[i] - b[i - 1]$互不干擾,不妨設這個串關于中心點對稱的這么一對區間的串分別為$(S_1, S_2)$
題目的限制相當與存在$(T_1, T_2)$使得$T_1 = inv(S_2) \;and\;T_2 = inv(S_1)$
考慮一對串$(S_1, S_2)$被計數多少次,我們分類討論一下
?
一個長為$L$的子串的方案數為$S^L$,即為$f(L)$
一個長為$L$,字符集為$S$的區間,形成回文串的方案數為$S^{\frac{L +1}{2}}$,記為$g(L)$
如果$(S_1, S_2)$中有兩個回文串,會被算重0次,否則都會被算重1次
那么方案數為$(f(L)^2 - g(L)^2) / 2 + g(L) * g(L)$
化簡一下,$f(L) * (f(L) + 1) / 2$
?
復雜度$O(n \log n)$
#include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> namespace remoon {#define re register#define de double#define le long double#define ri register int#define ll long long#define sh short#define pii pair<int, int>#define mp make_pair#define pb push_back#define tpr template <typename ra>#define rep(iu, st, ed) for(ri iu = st; iu <= ed; iu ++)#define drep(iu, ed, st) for(ri iu = ed; iu >= st; iu --) extern inline char gc() {static char RR[23456], *S = RR + 23333, *T = RR + 23333;if(S == T) fread(RR, 1, 23333, stdin), S = RR;return *S ++;}inline int read() {int p = 0, w = 1; char c = gc();while(c > '9' || c < '0') { if(c == '-') w = -1; c = gc(); }while(c >= '0' && c <= '9') p = p * 10 + c - '0', c = gc();return p * w;}int wr[50], rw;#define pc(iw) putchar(iw)tpr inline void write(ra o, char c = '\n') {if(!o) pc('0');if(o < 0) o = -o, pc('-');while(o) wr[++ rw] = o % 10, o /= 10;while(rw) pc(wr[rw --] + '0');pc(c);}tpr inline void cmin(ra &a, ra b) { if(a > b) a = b; }tpr inline void cmax(ra &a, ra b) { if(a < b) a = b; } tpr inline bool ckmin(ra &a, ra b) { return (a > b) ? a = b, 1 : 0; }tpr inline bool ckmax(ra &a, ra b) { return (a < b) ? a = b, 1 : 0; } } using namespace std; using namespace remoon;#define mod 998244353 #define iv2 499122177 #define sid 200050inline int fp(int a, int k) {int ret = 1;for( ; k; k >>= 1, a = 1ll * a * a % mod)if(k & 1) ret = 1ll * ret * a % mod;return ret; }int n, m, S; int b[sid];int main() {n = read(); m = read(); S = read();rep(i, 1, m) b[i] = read(); int ans = fp(S, n - (b[m] * 2));rep(i, 1, m) {int L = b[i] - b[i - 1];ans = 1ll * ans * fp(S, L) % mod * (fp(S, L) + 1) % mod * iv2 % mod;}write(ans);return 0; }?
轉載于:https://www.cnblogs.com/reverymoon/p/9779929.html
總結
以上是生活随笔為你收集整理的CodeForces 1065E. Side Transmutations 计数的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: react todolist代码优化
- 下一篇: 2018.08.16 洛谷P2029 跳
