2020 Multi-University Training Contest 5
Tetrahedron
1h2=1a2+1b2+1c2\cfrac{1}{h^2}=\cfrac{1}{a^2}+\cfrac{1}{b^2}+\cfrac{1}{c^2}h21=a21+b21+c21
E(x+y)=E(x)+E(y)E(x+y)=E(x)+E(y)E(x+y)=E(x)+E(y)
// 百思不得其解 赛中3秒过了 赛后T cin改成scanf后4秒过了 hdu这是什么机制???
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int N = 6e6 + 10;
int n;ll qpow(ll a, ll b) {a %= mod;ll res = 1;while (b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}ll f[N], sum[N];int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);for (int i = 1, lim = 6e6; i <= lim; i++) {f[i] = qpow(1ll * i * i, mod - 2);sum[i] = (sum[i - 1] + f[i]) % mod;}int T;cin >> T;while (T--) {cin >> n;ll a = (qpow(n, mod - 2) * 3) % mod;cout << ((a * sum[n]) % mod) << endl;}return 0;
}
Boring Game
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
vector<int> v[N];
int a[N];
int n, m, k;int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T;cin >> T;for (int cs = 1; cs <= T; cs++) {cin >> n >> k;int lim = 2 * n * (1 << k);m = (1 << k);for (int i = 1; i <= m; i++) {v[i].clear();}for (int i = 1; i <= lim; i++) {cin >> a[i];v[m].push_back(a[i]);}reverse(v[m].begin(), v[m].end());for (int t = 0; t < k; t++) {for (int i = m - (1 << t) + 1, j = i - 1; i <= m; i++, j--) {int mid = v[i].size() / 2;for (int l = 0; l < mid; l++) {v[j].push_back(v[i].back());v[i].pop_back();}}}for (int i = 2 * n - 1; i >= 0; i--) {for (int j = 1; j <= m; j++) {cout << v[j][i] << (j == m && i == 0 ? "\n" : " ");}}}return 0;
}
Expression
Array Repairing
Alice and Bob
Tree
Set2
Paperfolding
经画图 和撕了N张纸 后发现,左右对折、上下对折之间的顺序没有任何关系,
假设左右对折了 xxx 次,上下对折了 yyy 次,最后横竖裁开,纸片个数 =(2x+1)(2y+1)=(2^x+1)(2^y+1)=(2x+1)(2y+1)
E(x)=2n+1+2×3n2nE(x)= 2^n+1+\cfrac{2\times3^n}{2^n}E(x)=2n+1+2n2×3n
裁纸数个数的时候发现,如果只有左右对折 or 上下对折时,记 axa_xax 为对折了 xxx 次后纸片的个数
有如下数列:
a1=6a_1=6a1=6、a2=10a_2=10a2=10、a3=18a_3=18a3=18、a4=34a_4=34a4=34 …
a2−a1=4a_2-a_1=4a2−a1=4、a3−a2=8a_3-a_2=8a3−a2=8、a4−a3=16a_4-a_3=16a4−a3=16…
以上面的数列为例,记
an+1=an+2n+1a_{n+1}=a_n+2^{n+1}an+1=an+2n+1
an+1−x=an+2n+1−xa_{n+1}-x=a_n+2^{n+1}-xan+1−x=an+2n+1−x
这个数是自己构造的,构造出来的目的是使等式左右两边相似,这里令 x=2n+2x=2^{n+2}x=2n+2
发现 an−2n+1a_n-2^{n+1}an−2n+1 是个公比 q=1q=1q=1 的等比数列,
an−2n+1=...=a1−22=6−4=2a_n-2^{n+1}=...=a_1-2^2=6-4=2an−2n+1=...=a1−22=6−4=2
an=2n+1+2a_n=2^{n+1}+2an=2n+1+2
总结:若存在 an+1=an+bka_{n+1}=a_n+b^kan+1=an+bk,则构造通项公式 an−bk+1b−1a_n-\cfrac{b^{k+1}}{b-1}an−b−1bk+1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;namespace MOD { // 取模运算板子const ll mod = 998244353;ll qpow(ll a, ll b) {a %= mod;ll res = 1;while (b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;}ll Mul(ll a, ll b) {return (a * b) % mod;}ll Sub(ll a, ll b) {return (a - b + mod) % mod;}ll Add(ll a, ll b) {return (a + b) % mod;}
}
using namespace MOD;int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin >> T;while (T--) {cin >> n;if (n == 0) cout << 4 << endl;else if (n == 1) cout << 6 << endl;else {ll _2n = qpow(2, n);// 2^nll _3n = qpow(3, n); // 3^nll Inv_2n = qpow(_2n, mod - 2); // 1/2^nll res = Add(1, Add(_2n, Mul(Mul(2, _3n), Inv_2n)));cout << res << endl;}}return 0;
}
Set1
cnt[i]cnt[i]cnt[i] 表示第 iii 个元素被留到最后的方案数
此时,被删去的元素有前面 i−1i-1i−1 个 和 后面 n−in-in−i 个
前面 i−1i-1i−1 个元素里有操作1删去的,也有操作2随机删去的,但后面n−in-in−i个元素一定是被操作2随机删去的,
所以当且仅当 n−i≤i−1n-i\le i-1n−i≤i−1 的时候,iii 才有可能被留下
题目规定操作1和操作2轮流操作,所以在前面 i−1i-1i−1 个元素里挑选 n−in-in−i 个,和后面 n−in-in−i 个元素匹配,
且由于操作1每次都是删除整个集合里最小的元素,所以在前面i−1i-1i−1个元素里选出来的n−in-in−i个元素,一定是有序的,但后面的n−in-in−i个元素是无序的,所以这一部分的方案数有
Ci−1n−i×(n−i)!C_{i-1}^{n-i}\times (n-i)!Ci−1n−i×(n−i)!
再考虑前面剩下的 i−1−(n−i)=2i−n−1i-1-(n-i)=2i-n-1i−1−(n−i)=2i−n−1 个元素两两配对,
其中两两分配的元素相同,但前后顺序不同(12|34、 34|12 这样的)有 n2!\cfrac{n}{2}!2n! 种
但是在前面剩下的 2i−n−12i-n-12i−n−1 个元素里,
分组后每一组里的两个数显然是小数为操作1删除的,大数为操作2删除的,是固定的顺序,
且所有组先后发生的顺序也是固定的,如果有分组如 12|34,显然3、4的删除不可能能发生在1、2的删除之前
总方案数 sum=∑cnt[i]sum=\sum cnt[i]sum=∑cnt[i]
每个数被留下的概率 p[i]=cnt[i]sump[i]=\cfrac{cnt[i]}{sum}p[i]=sumcnt[i]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int N = 5e6 + 10;
const int M = 5e6;
int n;ll Mul(ll a, ll b) { return (a * b) % mod; }ll Add(ll a, ll b) { return (a + b) % mod; }ll Sub(ll a, ll b) { return (a - b + mod) % mod; }ll qpow(ll a, ll b) {a %= mod;ll res = 1;while (b) {if (b & 1) res = Mul(res, a);b >>= 1;a = Mul(a, a);}return res;
}ll fac[N], inv[N];
ll inv_2[N];// 1/(2^i)void init(int n) {fac[0] = inv[0] = inv_2[0] = 1;int inv2 = qpow(2, mod - 2);for (int i = 1; i <= n; ++i) {fac[i] = Mul(fac[i - 1], i);inv_2[i] = Mul(inv_2[i - 1], inv2);inv[i] = Mul(inv[i - 1], qpow(i, mod - 2));}
}ll C(int n, int m) {if (n < m || m < 0)return 0;return Mul(Mul(fac[n], inv[m]), inv[n - m]);
}ll cnt[N];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);init(M);int T;cin >> T;for (int cs = 1; cs <= T; cs++) {cin >> n;ll sum = 0;for (int i = 1; i <= n; i++) {int tmp = i * 2 - n - 1;if (tmp < 0) cnt[i] = 0;elsecnt[i] = Mul(Mul(C(i - 1, n - i), fac[n - i]),Mul(Mul(fac[tmp], inv_2[tmp / 2]), inv[tmp / 2]));sum = Add(sum, cnt[i]);}ll inv_sum = qpow(sum, mod - 2);for (int i = 1; i <= n; i++) {cout << Mul(cnt[i], inv_sum) << (i == n ? "\n" : " ");}}return 0;
}
2020 Multi-University Training Contest 5相关推荐
- Sichuan University Programming Contest 2018 Preliminary
嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...
- HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...
- HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2
/* HDU 6051 - If the starlight never fade [ 原根,欧拉函数 ] | 2017 Multi-University Training Contest 2 题意: ...
- HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3
/* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意:给出排列 a[N],求所有区间的第 ...
- 2017 Multi-University Training Contest - Team 3 Kanade's sum hd6058
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6058 题目: Kanade's sum Time Limit: 4000/2000 MS (J ...
- 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6324 Problem F. Grab The Tree Time Limit: 2000/1000 MS ...
- hdu 4925 Apple Tree--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...
- HUST-2015 Multi-University Training Contest 9
2015 Multi-University Training Contest 9 solutions BY xudyh 1001.Expression 记dp_{l,r}dpl,r表示l,rl, ...
- 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...
- 2017 Multi-University Training Contest - Team 1
2017 Multi-University Training Contest - Team 1 01 签到的 #include<bits/stdc++.h> using names ...
最新文章
- pygame 文字输入交互_pygame能接收用户的文本输入吗?
- 在linux上cuda9.0 cudnn7.* 安装python3.6 tensorflow 1.5.1
- C++ 设置线程名字
- android keyevent.java,dispatchKeyEvent简单理解
- Oracle回收站解决误删除表
- 11.卷1(套接字联网API)---名字与地址转换
- 读书笔记_算法第四版(一)
- 【数据库】E-R图相关知识、绘制方法及工具推荐
- 普通table表格样式及代码大全
- html5 随机抽奖,jQuery+H5按空格键随机抽奖代码
- Python利用selenium实现自动登录网页qq
- python游戏寻路_python模拟实现A*寻路算法
- win10系统计算机如何加密,win10系统自带加密使用的设置方法
- dell Vostro3670安装固态硬盘、win10系统教程
- android AlarmManager详解,Alarm的设定和取消。
- 微信小程序 点击展开收起(点谁谁展开/收起)
- 机器学习分类器——案例(opencv sklearn svm ann)
- Ansys-静力学分析-薄壁圆筒学习心得
- Win10删除右键菜单快捷键方法
- 一个大四实习生从安卓小白到可以独自承担安卓和web前端的一年奋斗之旅
热门文章
- Lombok插件初步了解
- 一步步实现 仿制Android LOL多玩盒子(三) 英雄基础
- flex blazeds java spring_flex+blazeds+java+spring后台消息推送,有界面维护
- 迷人的巴宝莉时装附件配置
- BT网络电视-Coolstreaming PPLive
- Lightbox弹出层插件:jQuery弹出层插件用法
- 计算机安装网络设置,打印机网络设置安装方法(通用全面)
- JAVA双大括号语法
- python-----即时标记 (读取文本)
- 智慧体育馆 3D 可视化,掀起城市建设新热潮