AtCoder WTF 2019 B Multiple of Nine/南外集训 2024.2.23 T1
给定
个区间 ,计算满足条件的长度为 的十进制数码串 的个数 :
。 其中
表示数码串 代表的整数, 表示子串 。在这道题中,我们允许任意形式的前导零。
。
所有涉及到的前缀和位置和
先计算出所有相邻关键位置前缀和都不同时的答案,然后计算出如果存在某个极大等价类,那么它会让答案乘以多少,这可以用
// Author: kyEEcccccc #include <bits/stdc++.h> using namespace std; using LL = long long; using ULL = unsigned long long; #define F(i, l, r) for (int i = (l); i <= (r); ++i) #define FF(i, r, l) for (int i = (r); i >= (l); --i) #define MAX(a, b) ((a) = max(a, b)) #define MIN(a, b) ((a) = min(a, b)) #define SZ(a) ((int)((a).size()) - 1) constexpr int N = 16, MOD = 1000000007; LL kpow(LL x, ULL k = MOD-2) { x = x % MOD; LL r = 1; while (k) { if (k & 1) r = r * x % MOD; x = x * x % MOD; k >>= 1; } return r; } int len, n; int a[N], b[N]; vector<int> pos; int ff[N*2], co[N*2], tot_co; LL tar[1 << N], coef[1 << N], f[1 << N]; int get_anc(int x) { if (x == ff[x]) return x; return ff[x] = get_anc(ff[x]); } signed main(void) { freopen("string.in", "r", stdin); freopen("string.out", "w", stdout); ios::sync_with_stdio(0), cin.tie(nullptr); cin >> len >> n; pos.assign(1, 0); F(i, 0, n-1) cin >> a[i] >> b[i], --a[i], pos.push_back(a[i]), pos.push_back(b[i]); sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin(), pos.end()), pos.end()); F(i, 0, n-1) { a[i] = lower_bound(pos.begin(), pos.end(), a[i]) - pos.begin(); b[i] = lower_bound(pos.begin(), pos.end(), b[i]) - pos.begin(); } F(i, 0, SZ(pos)) ff[i] = i; F(i, 0, n-1) ff[get_anc(b[i])] = get_anc(a[i]); F(i, 0, SZ(pos)) if (ff[i] == i) co[i] = tot_co++; F(i, 0, SZ(pos)) co[i] = co[get_anc(i)]; assert(tot_co <= N); LL xx = 1; F(i, 1, SZ(pos)) { int d = pos[i] - pos[i-1]; LL x = (kpow(10, d) - 1) * kpow(9) % MOD; (xx *= x) %= MOD; } F(w, 1, (1<<tot_co)-1) { tar[w] = 1; F(i, 1, SZ(pos)) { if (!((w >> co[i] & 1) && (w >> co[i-1] & 1))) continue; int d = pos[i] - pos[i-1]; LL x = (kpow(10, d) - 1) * kpow(9) % MOD; (tar[w] *= kpow(x) * (x+1) % MOD) %= MOD; } // cerr << w << ' ' << tar[w] << '\n'; coef[w] = tar[w]; int u = __lg(w&-w); for (int ww = w^1<<u; ww; ww = (ww - 1) & (w^1<<u)) { (coef[w] -= tar[ww] * coef[w^ww]) %= MOD; (f[w] += f[ww] * coef[w^ww] % MOD * 9) %= MOD; } (f[w] += coef[w] * 9) %= MOD; } LL ans = f[(1<<tot_co)-1] * xx % MOD * kpow(10, len - pos.back()) % MOD * kpow(9); cout << (ans % MOD + MOD) % MOD << '\n'; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现