在多校赛开始的前一天晚上看到了这么一条消息,我就知道这第一场比赛肯定不简单了。
果不其然。今天多校又是罚坐的一天。在开局了一个多小时后,大部分才A了一道题。
最后靠着队友才过了两题。
要求组一个长度为n的字符串。要求子回文串要尽可能的少。
这题的题面太具有迷惑性。明明结果最大也才26*25*24。还说最后结果要取模。
一开始以为长度为n的字符串,子回文串个一定是n,那么最后结果就是26^n。但是看到一群人wa了之后。就像事情没这么简单。
后来发现当n>=4就只要组合出一个三个字母不重复的,之后一直用这个填充就可以了。例如
abcabcabcabc。
#include
using namespace std;
#define ll long long
#define pll pair
#define pii pair
pii x[200005];
#define mod 998244353
ll fpow(ll a, ll b)
{
ll ans = 1;
while (b)
{
if (b & 1)ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
int main()
{
int t;
cin >> t;
while (t--)
{
ll n;
cin >> n;
if (n <= 3)cout << fpow(26, n) << endl;
else cout << 26 * 25 * 24 << endl;
}
return 0;
}
这题是斐波那契数列幂和的变形。数论题属于知识盲区。就贴个代码了
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int P = 1000000009;
const int INV2 = 500000005;
const int SQRT5 = 383008016;
const int INVSQRT5 = 276601605;
const int A = 691504013;
const int B = 308495997;
long long c;
const int N = 100005;
ll n, K;
ll fac[N], inv[N];
ll pa[N], pb[N];
ll pca[N],pcb[N];
inline void Pre(int n) {
fac[0] = 1;
for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % P;
inv[1] = 1; for (int i = 2; i <= n; i++) inv[i] = (P - P / i) * inv[P % i] % P;
inv[0] = 1; for (int i = 1; i <= n; i++) inv[i] = inv[i] * inv[i - 1] % P;
}
inline ll C(int n, int m) {
return fac[n] * inv[m] % P * inv[n - m] % P;
}
inline ll Pow(ll a, ll b) {
ll ret = 1;
for (; b; b >>= 1, a = a * a % P)
if (b & 1)
ret = ret * a % P;
return ret;
}
inline ll Inv(ll x) {
return Pow(x, P - 2);
}
inline void Solve() {
ll Ans = 0;
pca[0] = pcb[0]=1;
pca[1] = Pow(A, c);
pcb[1] = Pow(B, c);
for (int j = 2; j <= K; j++)
{
pca[j] = pca[j - 1] * pca[1] % P;
pcb[j] = pcb[j - 1] * pcb[1] % P;
}
for (int j = 0; j <= K; j++)
{
ll t = pca[K-j]*pcb[j] % P, tem;
tem = t == 1 ? n % P : t * (Pow(t, n) - 1 + P) % P * Inv(t - 1) % P;
if (~j & 1)
Ans += C(K, j) * tem % P, Ans %= P;
else
Ans += P - C(K, j) * tem % P, Ans %= P;
}
Ans = Ans * Pow(INVSQRT5, K) % P;
printf("%lld\n", Ans);
}
int main() {
int T;
Pre(100000);
scanf("%d", &T);
while (T--) {
scanf("%lld%lld%lld", &n,&c, &K);
Solve();
}
}