写在前面:
我艹了何意味啊何意味T1放依托定理的板子题然后我还没听过这个定理(虽然据说是数论基础四大定理之一,但是好像学习数论基础的时候根本没看到过这个定理也没做过相关的题😡😡😡😡😡😡😡);T2发现像同余最短路,发现我不会同余最短路,企图上数据结构狂假不止,优化暴力未果于是最终交上去的是最低档的暴力(🤢🤢🤢🤢🤢🤢🤢);T3差点没读懂题,写了背包和背包,然后方案数狂挂不止,最终背包套暴搜(亏我想得出来)依旧低档暴力;T4最后十几分钟不知道用了什么手段交了一发 \(1pts\) 然后头结束又交一发变成 \(18pts\) ,没看懂。
T1 虫群之心
打表大法好哇!
Solve:
因为要求 \((n!)mod~p\) ,然后 \(n\) 范围 \(3e9\) 奇大无比,但是 \(p\) 一定是质数,于是通过威尔逊定理,当 \(p\) 为素数时:
(证明可以看这个)
于是答案就是
别骂了我对公式一窍不通qwq………
但是我赛时并不会威尔逊定理,但是我又发现我会打表,于是特判完无解后我点开了大样例………
数据奇大无比,我™的什么也没看出来。
注意到题面上给了 \(p-1000≤m≤3e9\) ,而且 \(p\) 保证为素数,于是肝硬化企图输入大样例找 \(p>m~and~min(p-m)\) 的数据,于是:
-
大样例没有 \(p-m==1\) 的情况;
-
大样例没有 \(p-m==2\) 的情况;
-
大样例数据的第229、318、574个为 \(p-m==3\) ,然后把它们的 \([m,p]\) 的乘积、逆元、组合数………都输出一遍,发现有一个数对上了:竟然是 \(m+1\) 模 \(p\) 意义下的乘法逆元!
-
大样例数据的第758、563个为 \(p-m==4\) ,这次只输出逆元,暴力枚举相乘发现为 \((m_1)^{-1}·(m+2)^{-1}\) ;
-
大样例数据的第186个为 \(p-m==5\) ,输出逆元暴力枚举相乘发现可能为 \(∏_{i=m+1}^{p-2} i^{-1}\) ;
-
大样例没有 \(p-m==6\) 的情况😡😡😡😡😡😡😡;
· 大样例数据的第370个为 \(p-m==7\) ,输出逆元验证柿子发现真了。
于是写,然后写完了发现题面的小样例没过,于是特判 \(p==m+1\) 输出 \(m\) 。
Code:
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int t;
long long m, mod;
inline long long ksm(long long a, long long b){long long as = 1;while(b){if(b & 1){as = (as * a) % mod;}b >>= 1;a = (a * a) % mod;}return as;
}
int main(){freopen("factorial.in", "r", stdin), freopen("factorial.out", "w", stdout);ios::sync_with_stdio(0), cin. tie(0), cout. tie(0);
cin >> t;
while(t --){cin >> m >> mod;if(mod <= m){cout << 0 << '\n';continue;}if(mod == m + 1){cout << m << '\n';continue;}else{long long ans = 1;for(long long i = mod - 2; i > m; i --){ans = (ans * ksm(i, mod - 2)) % mod;}cout << ans << '\n';}
}return 0;
}
/*差为3的有3个。
3
2013265918 2013265921
1004535806 1004535809
1000000004 1000000007*/
/*差为4的有2个。
2
1000000005 1000000009
998244349 998244353*/
/*差为5的有1个。
1
1000000004 1000000009*///没有差为6的。/*差为7的有1个。
1
2999999752 2999999759*/
T2 喝醉的兔子
不,你应该是《酒醉的蝴蝶》:
怎么也飞不出
花花的世界
原来我是一只
酒醉的蝴蝶
你的那一句誓约
来的轻描又淡写
却要换我这一生
再也解不开的结
春去镜前花
秋来水中月
原来我就是那一只
酒醉的蝴蝶
花开花时节
月落月圆缺
原来我就是那一只
酒醉的蝴蝶
怎么也飞不出
花花的世界
原来我是一只
酒醉的蝴蝶
你的那一句誓约
来的轻描又淡写
却要换我这一生
再也解不开的结
春去镜前花
秋来水中月
原来我就是那一只
酒醉的蝴蝶
花开花时节
月落月圆缺
原来我就是那一只
酒醉的蝴蝶
春去镜前花
秋来水中月
原来我就是那一只
酒醉的蝴蝶
花开花时节
月落月圆缺
原来我就是那一只
酒醉的蝴蝶
酒醉的蝴蝶
我不会。
T3 盲盒流水线
我这辈子都被盲盒毁了!
Solve:
我们有两种背包的操作可以做到复杂度 \(O(m)\):一种是往背包里加入一个元素,一种是询问两个背包合并后价格总和不超过某个定值的答案。
于是考虑二分,对于一段背包的区间 \([l, r]\),如果 \(l==r\) ,那么直接记录答案。
否则取中点 \(mid\) ,从 \(mid\) 往两边分别做前缀/后缀背包,那么此时每个过中
点的询问可以视为两个已处理出来的背包合并后询问价格总和不超过 \(m\) 的答案,可以直接 \(O(m)\) 解决。
那么此时没有过中点的询问,所以可以分治解决 \([l, m]\) 和 \([m + 1, r]\)。
最终复杂度 \(O(nm \log n + qm)\)。
不能define int long long不然会像创世神一样全部爆炸。
强转要转全不然会像肝硬化一样 \(WA~49pts\) 。
Code:
#include <bits/stdc++.h>
using namespace std;
#define mid ((l + r) >> 1)
const int _ = 20010, __ = 100010, ___ = 510, mod = 998244353;
int n, q, v[_], w[_], l, r, m;
struct hhh{int l, r, m, n;
};
vector<hhh> c;
struct rain{int x;int n;
}mx[___], qian[_][___], hou[_][___], ans[__];
inline rain max(rain x, rain y){if(x. x != y. x){return x. x > y. x ? x : y;}return (rain){x. x, (x. n + y. n) % mod};
}
inline void solve(int l, int r){if(! c. size()){return ;}if(l == r){for(auto h : c){if(w[l] <= h. m){ans[h. n] = (rain){v[l], 1};}}return ;}vector<hhh> cun = c, o;c. clear();hou[mid + 1][0] = qian[mid][0] = (rain){0, 1};for(int i = 1; i <= 500; i ++){hou[mid + 1][i] = qian[mid][i] = (rain){- 999999999, 0};}for(int i = mid; i >= l; i --){for(int j = 0; j <= 500; j ++){hou[i][j] = hou[i + 1][j];if(j >= w[i]){hou[i][j] = max(hou[i][j], {hou[i + 1][j - w[i]]. x + v[i], hou[i + 1][j - w[i]]. n});}}}for(int i = mid + 1; i <= r; i ++){for(int j = 0; j <= 500; j ++){qian[i][j] = qian[i - 1][j];if(j >= w[i]){qian[i][j] = max(qian[i][j], {qian[i - 1][j - w[i]]. x + v[i], qian[i - 1][j - w[i]]. n});}}}while(cun. size()){hhh x = cun. back();cun. pop_back();if(x. r < mid){c. emplace_back(x);}else if(x. l > mid + 1){o. emplace_back(x);}else{rain s = {0, 0};mx[0] = hou[x. l][0];for(int j = 1; j <= x. m; j ++){mx[j] = max(mx[j - 1], hou[x. l][j]);}for(int j = 0; j <= x. m; j ++){s = max(s, (rain){mx[j]. x + qian[x. r][x. m - j]. x, (int)((long long)mx[j]. n * (long long)qian[x. r][x. m - j]. n % mod)});}ans[x. n] = s;}}solve(l, mid), c = o, o. clear();solve(mid + 1, r), c. clear();return ;
}
signed main(){freopen("knapsack.in","r",stdin);freopen("knapsack.out","w",stdout);ios::sync_with_stdio(0), cin. tie(0), cout. tie(0);cin >> n;for(int i = 1; i <= n; i ++){cin >> v[i] >> w[i];}cin >> q;for(int i = 1; i <= q; i ++){cin >> l >> r >> m;c. emplace_back((hhh){l, r, m, i});}solve(1, n);for(int i = 1; i <= q; i ++){if(! ans[i]. x){cout << "0 0\n";continue;}cout << ans[i]. x << ' ' << ans[i]. n << '\n';}return 0;
}
T4 失落的帝国
出题人找爸爸题,我不写。
赤了这口魔拟赛的石!