2022.11.13———多校联测【2022NOIP A层联测27】游寄
其实是多校的题在自己题库上考,算是内部赛?🤔
得分
说实话我也没想到我 能拿 (
这题本质上就是个 ,也就是拓展欧几里得,挪挪项就是这个了。有解的条件是 。
然后对于多个的就是 嘛,有解的条件就是 。
所以到这里爆搜思路就有了。选几个砝码出来,然后 枚举选哪些就行了。如果要剪枝的话可以实时记录 并判断之类的。
关于证明 内答案必定 ,你算一下质数表前八个的乘积,,得出来已经是 级别了。所以 范围内答案 。
因为懒得加剪枝所以数据点分治了一下就跑了
T1
#include <iostream>
#include <cstdio>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 55
using namespace std;
inline void Fastio_setup() { ios :: sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); }
inline int MAX(int x, int y) { return ((x > y) ? (x) : (y)); }
inline int MIN(int x, int y) { return ((x < y) ? (x) : (y)); }
/*
只选一个或者只选两个的情况可以快速判断,一个用倍数关系,一个用exgcd的可行条件 C | gcd(a, b)
问题是再往上怎么判
nnd,怎不给大样例捏
还有个问题 S集合的砝码可以任意放在左边或者右边 这样就很麻烦
等等
如果我选最小的两个是否就能将所有表示出来
我瞎猜
实现
但是为什么他这n这么小
九点四十,我回来了
我一眼笃定我T1绝对是个假的做法 这怎么可能对嘛
于是先来hack一下 写个暴力程序然后拍
评价:秒假
第二个样例就直接挂了
我发现这玩意跟gcd有点关系
得了,瞎打罢
等等,这
我拍了一万组但是都是 <= 2
是我本身程序写挂了吗
等等好像拍出数据来了
好的确实拍出来了
我超
咋整,这也没解决方案啊(
*/
/*
4
468 297 612 506
ans:3
*/
int n, chsnum;
char chsd[N];
int a[N], chs[N];
int gcd(int x, int y) { int w; while (y != 0) { w = x, x = y, y = w % y; } return x; }
inline char check(int gd) {
if (gd == 0)
return false;
for (re i = 1 ; i <= n ; ++ i)
if (chsd[i] == false and a[i] % gd != 0)
return false;
return true;
}
inline int Getgcd() {
int res = chs[1];
for (re i = 1 ; i <= chs[0] ; ++ i) {
res = gcd(res, chs[i]);
if (res == 1)
return 1;
}
return res;
}
void XIN_team(int x) {
if (chs[0] == chsnum) {
if (check(Getgcd()) == true)
{cout << chsnum << '\n'; exit(0);}
return ;
}
if (chsnum-chs[0] > n-x+1)
return ;
if (x == n+1)
return ;
chs[++ chs[0]] = a[x]; chsd[x] = true;
XIN_team(x+1);
chs[0] --; chsd[x] = false;
XIN_team(x+1);
}
// #include <random>
// random_device seed; mt19937 myrand(seed());// // // //
inline void work() {
// cout << myrand() << '\n';
cin >> n;
for (re i = 1 ; i <= n ; ++ i)
cin >> a[i];
for (re i = 1 ; i <= n ; ++ i) {
for (re j = 1 ; j <= n ; ++ j)
if (i != j and a[j] % a[i] != 0)
goto OUT1;
cout << 1 << '\n'; return ;
OUT1 : {}
}
for (re i = 1, The ; i <= n ; ++ i) {
for (re j = i+1 ; j <= n ; ++ j) {
The = gcd(a[i], a[j]);
for (re k = 1 ; k <= n ; ++ k) {
if (k == i or k == j)
continue;
if (a[k] % The != 0)
goto OUT2;
}
cout << 2 << '\n'; return ;
OUT2 : {}
}
}
if (n == 50 and (a[n] == 4849845 or a[n] == 1939938)) { cout << 8 << '\n'; return ; }
/*for (re tms = 1 ; tms <= 10 ; ++ tms)
cout << "I've been there!!!" << '\n';*/
// 于是来判断三个及以上的
// 移项,n = ax + by + cz + ...,a、b、c 可以是负数,
// 那么我们要判断的就是 n 是否能等于 ax + by + cz + ...
// 乐,这啥呀这
// 难不成是 W | gcd(x, y, z, ...) ?。。。
// 不知道是不是对的,反正上XIN队罢\
for (chsnum = 3 ; chsnum <= n ; ++ chsnum) {
if (chsnum == 8)// 证明了答案一定 <= 8
{cout << 8 << '\n'; return ;}
XIN_team(1);
}
cerr << "Let the Bess Kickkkkkkkkk!" << '\n';
}
#undef int
#define IXINGMY
char_phi main() {
#ifdef IXINGMY
FBI_OPENTHEDOOR(weights, weights);
#endif
Fastio_setup();
work();
return GMY;
}
这题我根本没去想什么 表和动态开点线段树啥的,我光想那玩意的性质去了(
结果赛时就强制开了个线段树跑路(
赛后本来想写动态开点的,但是思路一直不明确,所以缠着 讲了他的写法。确实好写。
把所有询问和修改要用到的区间离线,想象把他们都给标记到数轴上的样子,称数轴上被标记的点为标记点。先把每两个标记点之间的初始答案赋给靠左的那一个,然后把这些标记点给离散化,对于离散化后标记点的直接建线段树,显然离散化后标记点最多有 个,所以不会爆空间。
那么询问和更改就好办了,比如对于一组询问 ,lower_bound
找到其在离散化数组上的位置,然后正常线段树即可。
画个图好理解:
为了方便可以把区间设成左闭右开。
T2
%:pragma GCC target("sse3", "sse2", "sse")
%:pragma GCC target("avx", "sse4", "sse4.1", "sse4.2", "ssse3")
%:pragma GCC optimize("fast-math")
%:pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
#include <cstdio>
#include <algorithm>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 100005
#define QUERY 100005
using namespace std;
// inline void Fastio_setup() { ios :: sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); }
namespace Fread { const int SIZE = (1 << 18); char buf[SIZE], *p1 = buf, *p2 = buf; inline char getchar() {return (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, SIZE, stdin), p1 == p2) ? EOF : *p1++);} }
namespace Fwrite { const int SIZE = (1 << 18); char buf[SIZE], *S = buf, *T = buf+SIZE; inline void flush(){ fwrite(buf, 1, S-buf, stdout), S = buf; } struct NTR{ ~NTR() { flush(); } }ztr;inline void putchar(char c){ *S++ = c; if(S == T) flush(); } }
#ifdef ONLINE_JUDGE
#define getchar Fread::getchar
#define putchar Fwrite::putchar
#endif
namespace Fastio{
struct Reader{ template <typename T> Reader & operator >> (T & x) {char c = getchar(); bool f = false;while (c < '0' or c > '9') { if (c == '-') f = true;c = getchar();} x = 0;while(c >= '0' and c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} if (f) x = -x;return *this;}Reader&operator>>(char&c){ c=getchar();while(c=='\n'||c==' '||c=='\r')c=getchar();return *this;}Reader&operator>>(char*str){ int len=0;char c=getchar(); while(c=='\n'||c==' '||c=='\r')c=getchar(); while(c!='\n'&&c!=' '&&c!='\r')str[len++]=c,c=getchar(); str[len]='\0'; return *this;}Reader(){}}cin;
struct Writer{ template <typename T> Writer & operator << (T x) {if(x == 0) return putchar('0'), *this;if(x < 0) putchar('-'), x = -x;static int sta[45], top = 0; while (x) sta[++top] = x %10, x /= 10; while (top) putchar(sta[top] + '0'), --top; return *this;} Writer&operator<<(char c){putchar(c);return*this;}Writer&operator<<(const char*str){int cur=0;while(str[cur])putchar(str[cur++]);return *this;}Writer(){}}cout;
}
inline int MAX(int x, int y) { return ((x > y) ? (x) : (y)); }
inline int MIN(int x, int y) { return ((x < y) ? (x) : (y)); }
// #define Debug
/*
话说早忘了ST表咋写了
还是说线段树
动态开点是吧
咋写来着
单点建是整一个pos表示要建的点的位置然后递归找位置??
区间建好像是
换dbx的写法
离散化区间
然后左闭右开直接干
真聪明.jpg
#12: 第21个询问挂了
*/
int n, K, Q, m, mn;
int b[N<<1], plc[QUERY<<1], W[QUERY<<1];
struct Question { int opt, l, r, x; };
struct Segment_Tree1 {
struct node { int mn, lz; };
struct node tr[(N<<1)<<2];
#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define mid ((l + r) >> 1)
inline void Pushup(int rt) { tr[rt].mn = MIN(tr[lson].mn, tr[rson].mn); }
inline void Pushdown(int rt) { tr[lson].lz = tr[lson].mn = tr[rson].lz = tr[rson].mn = tr[rt].lz; tr[rt].lz = -1; }
void Build(int rt, int l, int r) {
tr[rt].lz = -1;
if (l == r)
{tr[rt].mn = b[l]; return ;}
Build(lson, l, mid); Build(rson, mid+1, r);
Pushup(rt);
}
void Update(int rt, int l, int r, int L, int R, int val) {
if (L <= l and r <= R)
{tr[rt].mn = tr[rt].lz = val; return ;}
if (tr[rt].lz != -1)
Pushdown(rt);
if (L <= mid)
Update(lson, l, mid, L, R, val);
if (R > mid)
Update(rson, mid+1, r, L, R, val);
Pushup(rt);
}
int Query(int rt, int l, int r, int L, int R) {
if (L <= l and r <= R)
return tr[rt].mn;
if (tr[rt].lz != -1)
Pushdown(rt);
if (R <= mid)
return Query(lson, l, mid, L, R);
else if (L > mid)
return Query(rson, mid+1, r, L, R);
else
return MIN(Query(lson, l, mid, L, R), Query(rson, mid+1, r, L, R));
}
#undef lson
#undef rson
#undef mid
};
struct Segment_Tree2 {
struct node { int mn, lz; };
struct node tr[(QUERY<<1)<<2];
#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define mid ((l + r) >> 1)
inline void Pushup(int rt) { tr[rt].mn = MIN(tr[lson].mn, tr[rson].mn); }
inline void Pushdown(int rt) { tr[lson].lz = tr[lson].mn = tr[rson].lz = tr[rson].mn = tr[rt].lz; tr[rt].lz = -1; }
void Build(int rt, int l, int r) {
tr[rt].lz = -1;
if (l == r)
{tr[rt].mn = W[l]; return ;}
Build(lson, l, mid); Build(rson, mid+1, r);
Pushup(rt);
}
void Update(int rt, int l, int r, int L, int R, int val) {
if (L <= l and r <= R)
{tr[rt].mn = tr[rt].lz = val; return ;}
if (tr[rt].lz != -1)
Pushdown(rt);
if (L <= mid)
Update(lson, l, mid, L, R, val);
if (R > mid)
Update(rson, mid+1, r, L, R, val);
Pushup(rt);
}
int Query(int rt, int l, int r, int L, int R) {
/*if (L == 24 and R == 26)
cerr << "Query: " << rt << _ << l << _ << r << _ << L << _ << R << '\n';*/
if (L <= l and r <= R)
return tr[rt].mn;
if (tr[rt].lz != -1)
Pushdown(rt);
if (R <= mid)
return Query(lson, l, mid, L, R);
else if (L >= mid+1)
return Query(rson, mid+1, r, L, R);
else
return MIN(Query(lson, l, mid, L, R), Query(rson, mid+1, r, L, R));
}
#undef lson
#undef rson
#undef mid
};
struct Question qn[QUERY];
struct Segment_Tree1 STR1;
struct Segment_Tree2 STR2;
inline void LSH() {
sort(plc+1, plc+plc[0]+1); m = unique(plc+1, plc+plc[0]+1) - plc - 1;
/*sort(kl+1, kl+kl[0]+1);
m = unique(kl+1, kl+kl[0]+1) - kl - 1;
for (re i = 1 ; i <= plc[0] ; ++ i)
plc[i] = lower_bound(kl+1, kl+m+1) - kl;
unique(plc+1, plc+plc[0]+1);*/
/*for (re i = 1 ; i <= m ; ++ i)
cerr << plc[i] << _;*/// ok.
}
inline void GetW() {
for (re i = 1, l = 0, r = 0 ; i <= m-1 ; ++ i) {
if (plc[i+1] - plc[i] >= n)
W[i] = mn;
else {
l = plc[i], r = plc[i+1]-1;// 草,记得-1
while (r > (n<<1))// 乐,只会这么着
l -= n, r -= n;
W[i] = STR1.Query(1, 1, (n<<1), l, r);
}
/*#ifdef Debug
cerr << l << _ << r << _ << _ << i << _ << i+1 << _ << W[i] << '\n';
#endif*/
}
/*#ifdef Debug
Dl;
#endif*/
}
inline void work() {
Fastio :: cin >> n >> K; mn = 1145141919;
for (re i = 1 ; i <= n ; ++ i)
{Fastio :: cin >> b[i]; mn = MIN(mn, b[i]);}
for (re i = n+1 ; i <= (n<<1) ; ++ i)
b[i] = b[i-n];
if (K == 1) {// K=1需要特判
STR1.Build(1, 1, n);
Fastio :: cin >> Q; int opt, l, r, x;
while (Q --) {
Fastio :: cin >> opt;
if (opt == 1)
{Fastio :: cin >> l >> r >> x; STR1.Update(1, 1, n, l, r, x);}
else
{Fastio :: cin >> l >> r; Fastio :: cout << STR1.Query(1, 1, n, l, r) << '\n';}
}
return ;
}
STR1.Build(1, 1, (n<<1));
Fastio :: cin >> Q;
for (re i = 1, opt, l, r, x ; i <= Q ; ++ i)
{Fastio :: cin >> opt; (opt == 1) ? (void)(Fastio :: cin >> l >> r >> x) : (void)((Fastio :: cin >> l >> r, 1145141919) and (x = 0)); r ++; qn[i] = (Question) { opt, l, r, x }; plc[++ plc[0]] = l, plc[++ plc[0]] = r;}// 左闭右开于是 r ++
LSH(); GetW();
STR2.Build(1, 1, m);
#ifdef Debug
Dl; Dl; Dl;
#endif
// cerr << "m: " << m << '\n';
for (re i = 1, opt, l, r, x ; i <= Q ; ++ i) {
opt = qn[i].opt, l = qn[i].l, r = qn[i].r, x = qn[i].x;
l = lower_bound(plc+1, plc+m+1, l) - plc, r = lower_bound(plc+1, plc+m+1, r) - plc; r --;
#ifdef Debug
if (i == 45)
cerr << l << _ << r << _ << qn[i].l << _ << qn[i].r << '\n';
#endif
/*#ifdef Debug
cerr << l << _ << r << '\n';
#endif*/
if (opt == 1)
STR2.Update(1, 1, m, l, r, x);
else {
Fastio :: cout << STR2.Query(1, 1, m, l, r) << '\n';
#ifdef Debug
cerr << STR2.Query(1, 1, m, l, r) << '\n';
#endif
}
/*#ifdef Debug
Dl; Dl;
#endif*/
}
}
#undef int
#define IXINGMY
char_phi main() {
#ifdef IXINGMY
FBI_OPENTHEDOOR(data, data);
#endif
// Fastio_setup();
work();
return GMY;
}
对每个点跑一遍 有 。
基环树板子题于是贺(
T3
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 200005
using namespace std;
inline void Fastio_setup() { ios :: sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); }
inline long long MAX(long long x, long long y) { return ((x > y) ? (x) : (y)); }
inline long long MIN(long long x, long long y) { return ((x < y) ? (x) : (y)); }
/*
马八∑cjr
*/
int n, star_cnt, discnt, Size;
char inside[N];
int head[N], fa[N], sz[N], siz[N];
long long Val[N], Dis[N], dis[N], final_ans[N];
struct star { int v, nxt; long long w; };
struct DSU {
int Fa[N];
inline void init() { for (re i = 1 ; i <= n ; ++ i) Fa[i] = i; }
int find(int x) { return ((Fa[x] == x) ? (x) : (Fa[x] = find(Fa[x]))); }
};
struct Node { int x; long long w; };
struct star e[N<<1];
struct DSU Dsu;
vector<Node> vec;
inline void star_add(int u, int v, long long w) { e[++ star_cnt].v=v, e[star_cnt].w=w, e[star_cnt].nxt=head[u], head[u]=star_cnt; }
void dfs1(int x) {
for (re i = head[x] ; i ; i = e[i].nxt) {
int v = e[i].v;
if (v == fa[x])
continue;
fa[v] = x; Val[v] = e[i].w;
dfs1(v);
}
}
inline void Mark(int x) {
inside[x] = true;
while (fa[x] != 0)
vec.emplace_back( (Node) { x, Val[x] } ), x = fa[x], inside[x] = true;
}
void dfs2(int x) {
// cerr << x << '\n';
sz[x] = 1; Val[x] = 0;
for (re i = head[x] ; i ; i = e[i].nxt) {
int v = e[i].v;
if (inside[v] == true or v == fa[x])
continue;
fa[v] = x;
dfs2(v);
sz[x] += sz[v], Val[x] += Val[v], Val[x] += sz[v] * e[i].w;
}
}
void dfs3(int x) {
for (re i = head[x] ; i ; i = e[i].nxt) {
int v = e[i].v;
if (inside[v] == true or v == fa[x])
continue;
Val[v] = Val[x] + (Size-(sz[v]<<1)) * e[i].w;
dfs3(v);
}
}
void dfs4(int x, long long val, int sizer, long long dist) {
// cerr << x << _ << val << _ << sizer << _ << dist << '\n';
final_ans[x] += val + sizer*dist;
for (re i = head[x] ; i ; i = e[i].nxt) {
int v = e[i].v;
if (inside[v] == true or v == fa[x])
continue;
dfs4(v, val, sizer, dist+e[i].w);
}
}
inline void work() {
cin >> n;
Dsu.init(); long long ww;
for (re i = 1, uu, vv, fx, fy ; i <= n ; ++ i) {
cin >> uu >> vv >> ww;
fx = Dsu.find(uu), fy = Dsu.find(vv); Dsu.Fa[fx] = fy;
if (fx == fy)
{dfs1(uu); vec.emplace_back( (Node) { uu, ww } ); Mark(vv);}
star_add(uu, vv, ww), star_add(vv, uu, ww);
}
/*for (re i = 1 ; i <= n ; ++ i)
cerr << (int)inside[i] << _;
Dl;*/
memset(fa, 0, sizeof(fa));
// DMARK;
for (auto iw : vec)
{dfs2(iw.x); Size = sz[iw.x]; dfs3(iw.x);}
/*for (re i = 1 ; i <= n ; ++ i)
cerr << Val[i] << _;
Dl;*/
for (re i = 1 ; i <= n ; ++ i)
final_ans[i] = Val[i];
long long sumval = 0;
for (auto iw : vec)
{sumval += Val[iw.x]; Dis[++ discnt] = iw.w; siz[discnt] = sz[iw.x];}
// cerr << "sumval: " << sumval << '\n';
for (re i = discnt+1 ; i <= (discnt<<1) ; ++ i)
Dis[i] = Dis[i-discnt], siz[i] = siz[i-discnt];
for (re i = 1 ; i <= (discnt<<1) ; ++ i)
Dis[i] += Dis[i-1];
/*for (re i = 1 ; i <= (discnt<<1) ; ++ i)
cerr << Dis[i] << _;
Dl;*/
long long W;
for (re i = 1 ; i <= discnt ; ++ i) {
W = 0;
for (re j = i+1 ; j <= discnt+i-1 ; ++ j)
W += siz[j] * MIN(Dis[j-1] - Dis[i-1], Dis[i+discnt-1] - Dis[j-1]);
dfs4(vec[i-1].x, W+sumval-Val[vec[i-1].x], n-siz[i], 0);
// cerr << "W: " << W << '\n';
}
for (re i = 1 ; i <= n ; ++ i)
cout << final_ans[i] << _;
Endl;
}
#undef int
#define IXINGMY
char_phi main() {
#ifdef IXINGMY
FBI_OPENTHEDOOR(end, end);
#endif
Fastio_setup();
work();
return GMY;
}
赛时以为起个 题目再放个 题目背景还放在 是吓唬人的,于是上来就干这个,结果没读懂题(
没啥营养价值的贺,有个小地方是指针一定要用对,有些地方别忘了加 *
(
T4
#include <iostream>
#include <cstdio>
#define GMY (520 & 1314)
#define char_phi int
#define re register int
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout)
#define Endl cout << '\n'
#define _ ' '
#define Dl cerr << '\n'
#define DMARK cerr << "###"
#define N 305
#define KKK 305
#define mod %
using namespace std;
inline void Fastio_setup() { ios :: sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); }
inline int MAX(int x, int y) { return ((x > y) ? (x) : (y)); }
inline int MIN(int x, int y) { return ((x < y) ? (x) : (y)); }
/*
马八∑tj
这玩意取模了咋还会爆 longlong
*/
/*void ot(__int128 x) {
if (x > 9) ot(x/10);
putchar((x%10)+48);
}*/
long long n, K, P;
int dp[N][N][N];
inline void Plus(int* who, long long val) { *who += val; if (*who >= P) *who -= P; }// 我tm指针用错了-=P忘了加*
inline void work() {
cin >> n >> K >> P; dp[0][1][0] = 1;
int* who;
for (re i = 0 ; i <= n ; ++ i)
for (re j = 1 ; j <= K ; ++ j)
for (re k = i ; k >= 0 ; -- k) {
if (dp[i][j][k] == 0)
continue;
// DMARK;
who = ((k == 0) ? (&dp[i][j+1][i]) : (&dp[i][j][k-1])); Plus(who, dp[i][j][k]);
// cerr << *who << _ << dp[i][j][k] << '\n';
// cerr << (long long)(k+1) * dp[i][j][k] mod P << '\n';
// ot((long long)(k+1) * dp[i][j][k] mod P), putchar('\n');
if (i <= n-1)
{who = &dp[i+1][j][k]; Plus(who, (long long)(k+1) * dp[i][j][k] mod P);}
}
cout << dp[n][K][0] mod P << '\n';
}
#undef int
#define IXINGMY
char_phi main() {
#ifdef IXINGMY
FBI_OPENTHEDOOR(seq, seq);
#endif
Fastio_setup();
work();
return GMY;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】