外贸网站建设模版,淘宝客网站可以备案吗,厚瑜网站建设,玩具网站建设首先题目有博弈#xff0c;先分析一波最优策略#xff08;步骤#xff1a;分析性质#xff09;。
两个人#xff0c;所以显然考虑奇偶考虑法递归考虑。
首先删就是使子问题-1#xff0c;重新排列是在当前子问题里的。
一个串的排列是有限的#xff0c;所以这里就可以…首先题目有博弈先分析一波最优策略步骤分析性质。
两个人所以显然考虑奇偶考虑法递归考虑。
首先删就是使子问题-1重新排列是在当前子问题里的。
一个串的排列是有限的所以这里就可以上奇偶考虑法。如果有偶数种串则必然是后手先“被迫“进入子问题要算上初始情况
考虑假设法我们可以先假设进入子问题
必赢。先手进必死。偶串时后手被迫进入先手胜
我们的奇偶考虑法证明了串方案wei偶数时先手必胜了
考虑奇数种时先手能不能赢同样假设一下
进去必赢。先手胜进去必输。先手被迫进入后手胜
现在先手就不能再这层耗了只能进入下一层了。然后结合上面的结论只能进入子问题种类数是奇数时先手才有机会。
然后好像就卡住了…
然后回到题目看一看发现问种类数考虑dp太早了就先想下计数
假设每种字符出现次数为 a a a那么就有 a n \frac a n na种串。然后我们现在这个是奇数。
考虑删掉一个变成什么是 n ! ∏ a ! ( a − 1 ) ! \frac {n!} {\prod a! (a-1)!} ∏a!(a−1)!n!我们现在希望这个是奇数。我们除一下发现上面要乘个 a n \frac a n na则这个也要是奇数。
我们考虑我们还漏了什么条件 ∑ a n \sum an ∑an。奇偶的话就从二进制的角度推敲一下 n n n 的最低位1必然存在在其中一个 a a a 里所以 a n \frac a n na 为奇数必然存在。
所以现在只和 n n n 的奇偶有关了。 n n n 偶先手必胜否则必败。
剩下dp就很简单了。若 n n n 为奇数我们要构造 a n \frac a n na 为偶数考虑用全局-奇。
因为有 ∏ a ! ∣ n ! \prod a! | n! ∏a!∣n!所以 ∏ a ! \prod a! ∏a! 的2的因子和 n ! n! n! 只能相同。考虑类似10不能用11表示只能用100表示。所以每个 a a a 必然是 n n n 的子集。同时 ∑ a n \sum an ∑an
然后dp维护下 1 ∏ a ! \frac 1{\prod a!} ∏a!1 的和。
有个小优化就是钦定当前lowbit必选最后乘个阶乘即可
#includebits/stdc.h
using namespace std;
#define int long long
inline int read(){int x0,f1;char chgetchar(); while(ch0||
ch9){if(ch-)f-1;chgetchar();}while(ch0ch9){
x(x1)(x3)(ch^48);chgetchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//mt19937 rand(time(0));
//mt19937_64 rand(time(0));
//srand(time(0));
#define N 250010
//#define M
//#define mo
int mo;
int pw(int a, int b) {int ans1; while(b) {if(b1) ans*a; a*a; b1; ans%mo; a%mo; }return ans;
}
int fac[N], inv[N], ifac[N];
void init(int n) {int i; for(ifac[0]1; in; i) fac[i]fac[i-1]*i%mo; ifac[n]pw(fac[n], mo-2); for(in-1; i0; --i) ifac[i]ifac[i1]*(i1)%mo; for(i1; in; i) inv[i]ifac[i]*fac[i-1]%mo;
}
int C(int n, int m) {if(mn) return 0;return fac[n]*ifac[m]%mo*ifac[n-m]%mo;
}
int n, m, i, j, k, T;
int f[27][N], s, t, ans; void Add(int a, int b) {
// a(ab)%mo; ab; if(amo || amo) a%mo;
}int dfs(int i, int s) {
// printf(f[%lld][%lld] %lld\n, i, s, f[i][s]); if(f[i][s]!-1) return f[i][s]; if(i0 || s0) return 0; f[i][s]0; int js-s, t;
// printf(\n);
// printf(%lld %lld\n, S, j); for(t(s-j); ; t(t-1)(s-j)) {//aitAdd(f[i][s], dfs(i-1, s-j-t)*ifac[tj]); if(!t) break; }
// printf(f[%lld][%lld]%lld\n, i, s, f[i][s]); return f[i][s];
}signed main()
{
// freopen(in.txt, r, stdin);
// freopen(out.txt, w, stdout);
// Tread();
// while(T--) {
//
// }nread(); kread(); moread(); init(n); if(n%2) return printf(%lld\n, pw(k, n)), 0; memset(f, -1, sizeof(f)); f[0][0]1;
// for(i1; ik; i) printf(%lld %lld %lld\n, fac[n], f[i][0], fac[n]*f[i][0]%mo); for(i1; ik; i) {
// printf(dfs[%lld %lld]%lld\n, i, 0, dfs(i, 0)); Add(ans, fac[n]*dfs(i, n)%mo*C(k, i)%mo*fac[i]%mo); }
// printf(%lld\n, (ans%momo)%mo); Add(ans, pw(k, n)-2*ans); printf(%lld, (ans%momo)%mo); return 0;
}