题目大意
题目总结:Little String (Easy Version)
核心定义
对于一个长度为 n 的 01 字符串 w 和集合 {0,1,…,n−1} 的全排列 p,定义 f(w) 为满足以下所有条件的排列 p 的总数:
-
若 wi=1: 排列 p 中必须存在至少一个连续子段 [pl,…,pr],使得该子段的 MEX 等于 i。
-
若 wi=0: 排列 p 中不存在任何连续子段的 MEX 等于 i。
-
MEX 定义: 集合中未出现的最小非负整数。例如 mex([0,1,3])=2,mex([1,2])=0。
任务要求
样例解释对照
| 样例输入 |
n |
s |
c |
f(s) 计算与结果 |
解释 |
| 样例 3 |
4 |
1001 |
100 |
输出:4 |
满足条件的排列有 [0,2,3,1],[0,3,2,1],[1,2,3,0],[1,3,2,0]。f(s)=4 不被 100 整除。 |
| 样例 6 |
5 |
10001 |
8 |
输出:12 |
f(s)=12。其中一个合法排列为 [0,4,3,2,1]。12 不被 8 整除。 |
| 样例 9 |
3 |
101 |
4 |
输出:2 |
合法排列为 [0,2,1],[1,2,0]。f(s)=2 不被 4 整除。 |
| 样例 2 |
3 |
111 |
1 |
输出:-1 |
无论 f(s) 为多少,任何整数都能被 c=1 整除,故输出 −1。 |
思路讲解

题目中的条件,具体来说就是如上图所示,wi=0,就是 i 把 0~i−1 分隔开,wi=1,就是 i 位于 0~i−1 的左边或者右边。
那么是这样子的,这道题目如果把这个序列生成的这个过程看成从 0~n−1 不断插入的过程,那么如果 wi=0,那么 i 就插入在原来 0~i−1 之间的空当中。wi=1,只能插入在 0~i−1 的两段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| for (int i=1;i<=N-1;++i) { if (W[i]=='1') { ans*=2; ans%=mod; ans_c*=2; ans_c%=C; }else { ans*=(i-1); ans%=mod; ans_c*=i-1; ans_c%=C; } }
|
然后这道题目就解决了。
AC代码
AC
https://codeforces.com/contest/2189/submission/359662289
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#include <bits/stdc++.h> #include <ranges> #define all(vec) vec.begin(),vec.end() #define lson(o) (o<<1) #define rson(o) (o<<1|1) #define SZ(a) ((long long) a.size()) #define debug(var) cerr << #var <<":"<<var<<"\n"; #define cend cerr<<"\n-----------\n" #define fsp(x) fixed<<setprecision(x)
using namespace std;
using ll = long long; using ull = unsigned long long; using DB = double; using LD = long double;
using CD = complex<double>;
static constexpr ll MAXN = (ll)2e5+10, INF = (1ll<<61)-1; static constexpr ll mod = (ll)1e9+7; static constexpr double eps = 1e-8; const double pi = acos(-1.0);
ll lT;
void Solve() { ll N,C; cin >> N >> C; string W; cin>>W; W.insert(W.begin(),'#'); if (W[1]!='1' || W[N]!='1') { cout<<-1<<"\n"; return; } ll ans=1,ans_c=1; for (int i=1;i<=N-1;++i) { if (W[i]=='1') { ans*=2; ans%=mod; ans_c*=2; ans_c%=C; }else { ans*=(i-1); ans%=mod; ans_c*=i-1; ans_c%=C; } } if (ans_c==0) { cout<<-1<<"\n"; return; } ans%=mod; if (ans<0) ans+=mod; cout<<ans<<"\n"; }
signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> lT; while(lT--) Solve(); return 0; }
|
心路历程(WA,TLE,MLE……)