@2345安全卫士 我会上传图片!我不会做图片!
图片又不要做,只要随机一张网图当头图即可
嗯,那就只需要题目的质量高,其他的都没问题了
@览遍千秋 o原来如此,对了你有钩的对吧?
你调出来了吗?
没。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int fac[300005], inv[300005], len, ans;
unsigned long long hashp[300005], pw[300005];
unordered_map<unsigned long long, int> hs_t;
string s;
int qpow(int x, int y) {
int res = 1;
while (y) {
if (y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
void init() {
fac[0] = 1;
for (int i = 1; i <= 300000; i++) fac[i] = fac[i - 1] * i % mod;
inv[300000] = qpow(fac[300000], mod - 2);
for (int i = 299999; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
pw[0] = 1;
for (int i = 1; i <= len; i++) pw[i] = pw[i - 1] * 131 % mod;
for (int i = 1; i <= len; i++) hashp[i] = (hashp[i - 1] * 131 + s[i]) % mod;
}
unsigned long long gethash1(int l, int r) {
return (hashp[r] + mod - hashp[l - 1] * pw[r - l + 1] % mod) % mod;
}
signed main() {
cin >> s;
len = s.size();
s = ' ' + s;
init();
for (int x = 1; x <= len; x++) {
hs_t.clear();
int k = len / x;
// 处理正向分割:前k*x字符
for (int j = 1; j <= k; j++) {
int st = (j - 1) * x + 1;
int ed = st + x - 1;
hs_t[gethash1(st, ed)]++;
}
int res = fac[k];
for (auto &p : hs_t) res = res * inv[p.second] % mod;
if (len % x != 0) {
// 处理反向分割:后k*x字符
hs_t.clear();
int start_pos = len - k * x + 1;
for (int j = 1; j <= k; j++) {
int st = start_pos + (j - 1) * x;
int ed = st + x - 1;
hs_t[gethash1(st, ed)]++;
}
int res2 = fac[k];
for (auto &p : hs_t) res2 = res2 * inv[p.second] % mod;
ans = (ans + res + res2) % mod;
} else {
ans = (ans + res) % mod;
}
}
cout << ans;
return 0;
}
你先看看这个,输出差一点了
@览遍千秋 @2345安全卫士 如果有钩的话,帮我验一下题目呗 T577328 上帝 - 洛谷 T580140 上帝的游戏 - 洛谷
我现在的代码输出的就是这个
总感觉考虑漏了一些情况
哦哦哦,那我帮你找个大佬看看
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int fac[300005], inv[300005], len, ans;
unsigned long long hashp[300005], hashb[300005], pw[300005];
unordered_map<unsigned long long, int> hs_t;
string s;
int qpow(int x, int y) {
int res = 1;
while (y) {
if (y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
void init() {
fac[0] = 1;
for (int i = 1; i <= 300000; i++) fac[i] = fac[i - 1] * i % mod;
inv[300000] = qpow(fac[300000], mod - 2);
for (int i = 299999; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
pw[0] = 1;
for (int i = 1; i <= len; i++) pw[i] = pw[i - 1] * 131;
for (int i = 1; i <= len; i++) hashp[i] = hashp[i - 1] * 131 + s[i];
for (int i = len; i >= 1; i--) hashb[i] = hashb[i + 1] * 131 + s[i];
}
unsigned long long gethash1(int l, int r) {
return hashp[r] - hashp[l - 1] * pw[r - l + 1];
}
signed main() {
cin >> s;
len = s.size(); s = ' ' + s;
init();
for (int i = 1; i <= len; i++) {
hs_t.clear();
int k = len / i;
for (int j = 1; j <= k; j++) {
int st = i * (j - 1) + 1, ed = st + i - 1;
hs_t[gethash1(st, ed)]++;
}
int res = fac[k];
for (auto x : hs_t) res = res * inv[x.second] % mod;
if (len % i != 0) {
hs_t.clear();
int bk = len - k * i + 1;
for (int j = 1; j <= k; j++) {
int st = bk + (j - 1) * i, ed = st + i - 1;
hs_t[gethash1(st, ed)]++;
}
int res2 = fac[k];
for(auto x : hs_t) res2 = res2 * inv[x.second] % mod;
ans = (ans + res + res2) % mod;
} else ans = (ans + res) % mod;
}
cout << ans;
return 0;
}
我不是大佬
我没有钩子
@2345安全卫士 藏钩要脸吗(你就帮我验一下题目呗
我一直没钩a
我也没钩子哦
服务器繁忙啊啊啊
另外我的这份代码有两个点被卡了