求一下思路,

常见问题集合 | 洛谷帮助中心 (luogu.com.cn)

@2345安全卫士 我会上传图片!我不会做图片!

图片又不要做,只要随机一张网图当头图即可

嗯,那就只需要题目的质量高,其他的都没问题了

@览遍千秋 o原来如此,对了你有钩的对吧?

谁能帮我调下题啊qwq

你调出来了吗?

没。

#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;
}

我不是大佬

我没有钩子

image

@2345安全卫士 藏钩要脸吗(你就帮我验一下题目呗

我一直没钩a

我也没钩子哦

服务器繁忙啊啊啊
另外我的这份代码有两个点被卡了