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;
}

Funny String

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)=∑x×p(x)=∑x=0nCnx(2x+1)(2n−x+1)2nE(x)=\sum x\times p(x)=\sum^n_{x=0} \cfrac{C^x_n(2^x+1)(2^{n-x}+1)}{2^n}E(x)=∑x×p(x)=x=0∑n​2nCnx​(2x+1)(2n−x+1)​

其中分子部分
∑x=0nCnx(2x+1)(2n−x+1)=∑x=0nCnx(2n+2x+2n−x+1)=2n∑x=0nCnx+(∑x=0nCnx2x+∑x=0nCnx2n−x)+∑x=0nCnx\sum^n_{x=0}C^x_n(2^x+1)(2^{n-x}+1)\\=\sum^n_{x=0}C^x_n(2^n+2^x+2^{n-x}+1)\\=2^n\sum^n_{x=0}C^x_n+(\sum^n_{x=0} C^x_n2^x+\sum^n_{x=0} C^x_n2^{n-x})+\sum^n_{x=0} C^x_nx=0∑n​Cnx​(2x+1)(2n−x+1)=x=0∑n​Cnx​(2n+2x+2n−x+1)=2nx=0∑n​Cnx​+(x=0∑n​Cnx​2x+x=0∑n​Cnx​2n−x)+x=0∑n​Cnx​

观察发现
∑x=0nCnx2x=∑x=0nCnx2x×1n−x=(2+1)n=3n\sum^n_{x=0} C^x_n2^x=\sum^n_{x=0} C^x_n2^x\times 1^{n-x}=(2+1)^n=3^nx=0∑n​Cnx​2x=x=0∑n​Cnx​2x×1n−x=(2+1)n=3n

对,就是化成二项式,就是下面这个↓

(a+b)n=∑k=0nCnkakbn−k(a+b)^n=\sum^n_{k=0}C^k_na^kb^{n-k}(a+b)n=k=0∑n​Cnk​akbn−k
当 a=1a=1a=1 且 b=1b=1b=1 时,

(1+1)n=∑k=0nCnk1k1n−k=∑k=0nCnk=2n(1+1)^n=\sum^n_{k=0}C^k_n1^k1^{n-k}=\sum^n_{k=0}C^k_n=2^n(1+1)n=k=0∑n​Cnk​1k1n−k=k=0∑n​Cnk​=2n

然后回到本题,同理可得
∑x=0nCnx2n−x=∑x=0nCnx2n−x×1x=(1+2)n=3n\sum^n_{x=0} C^x_n2^{n-x}=\sum^n_{x=0} C^x_n2^{n-x}\times 1^{x}=(1+2)^n=3^nx=0∑n​Cnx​2n−x=x=0∑n​Cnx​2n−x×1x=(1+2)n=3n

因此化简原来的公式可以得出

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

然后让等式左右两边都减去同一个数 xxx,

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+1−2n+2=an+2n+1−2n+2=an+2n+1−2×2n+1=an−2n+1a_{n+1}-2^{n+2}=a_n+2^{n+1}-2^{n+2}=a_n+2^{n+1}-2\times2^{n+1}=a_n-2^{n+1}an+1​−2n+2=an​+2n+1−2n+2=an​+2n+1−2×2n+1=an​−2n+1

发现 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;
}

Function
Exam


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 个元素两两配对,

我们知道如果n个元素里两两配对,会有
Cn2×Cn−22×Cn−42...×C22C^{2}_{n}\times C^{2}_{n-2} \times C^2_{n-4}...\times C^2_2Cn2​×Cn−22​×Cn−42​...×C22​=n(n−1)2×(n−2)(n−3)2×...×2×12=n!2n2=\cfrac{n(n-1)}{2}\times \cfrac{(n-2)(n-3)}{2} \times...\times \cfrac{2\times1}{2}=\cfrac{n!}{2^{\frac{n}{2}}}=2n(n−1)​×2(n−2)(n−3)​×...×22×1​=22n​n!​

其中两两分配的元素相同,但前后顺序不同(12|34、 34|12 这样的)有 n2!\cfrac{n}{2}!2n​! 种

但是在前面剩下的 2i−n−12i-n-12i−n−1 个元素里,

分组后每一组里的两个数显然是小数为操作1删除的,大数为操作2删除的,是固定的顺序,

且所有组先后发生的顺序也是固定的,如果有分组如 12|34,显然3、4的删除不可能能发生在1、2的删除之前

所以这一部分的方案数有
(2i−n−1)!22i−n−12×1(2i−n−12)!\cfrac{(2i-n-1)!}{2^\frac{2i-n-1}{2}}\times \frac{1}{(\frac{2i-n-1}{2})!}222i−n−1​(2i−n−1)!​×(22i−n−1​)!1​

所以第 iii 个元素被留到最后的方案数为
cnt[i]=Ci−1n−i×(n−i)!×(2i−n−1)!22i−n−12×1(2i−n−12)!cnt[i]=C_{i-1}^{n-i}\times (n-i)! \times \cfrac{(2i-n-1)!}{2^\frac{2i-n-1}{2}}\times \frac{1}{(\frac{2i-n-1}{2})!}cnt[i]=Ci−1n−i​×(n−i)!×222i−n−1​(2i−n−1)!​×(22i−n−1​)!1​

总方案数 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;
}

An Easy Matrix Problem

2020 Multi-University Training Contest 5相关推荐

  1. Sichuan University Programming Contest 2018 Preliminary

    嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...

  2. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  3. 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 题意: ...

  4. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意:给出排列 a[N],求所有区间的第 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. HUST-2015 Multi-University Training Contest 9

    2015 Multi-University Training Contest 9 solutions BY xudyh 1001.Expression 记dp_{l,r}dp​l,r​​表示l,rl, ...

  9. 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 ...

  10. 2017 Multi-University Training Contest - Team 1

    2017 Multi-University Training Contest - Team 1 01     签到的 #include<bits/stdc++.h> using names ...

最新文章

  1. pygame 文字输入交互_pygame能接收用户的文本输入吗?
  2. 在linux上cuda9.0 cudnn7.* 安装python3.6 tensorflow 1.5.1
  3. C++ 设置线程名字
  4. android keyevent.java,dispatchKeyEvent简单理解
  5. Oracle回收站解决误删除表
  6. 11.卷1(套接字联网API)---名字与地址转换
  7. 读书笔记_算法第四版(一)
  8. 【数据库】E-R图相关知识、绘制方法及工具推荐
  9. 普通table表格样式及代码大全
  10. html5 随机抽奖,jQuery+H5按空格键随机抽奖代码
  11. Python利用selenium实现自动登录网页qq
  12. python游戏寻路_python模拟实现A*寻路算法
  13. win10系统计算机如何加密,win10系统自带加密使用的设置方法
  14. dell Vostro3670安装固态硬盘、win10系统教程
  15. android AlarmManager详解,Alarm的设定和取消。
  16. 微信小程序 点击展开收起(点谁谁展开/收起)
  17. 机器学习分类器——案例(opencv sklearn svm ann)
  18. Ansys-静力学分析-薄壁圆筒学习心得
  19. Win10删除右键菜单快捷键方法
  20. 一个大四实习生从安卓小白到可以独自承担安卓和web前端的一年奋斗之旅

热门文章

  1. Lombok插件初步了解
  2. 一步步实现 仿制Android LOL多玩盒子(三) 英雄基础
  3. flex blazeds java spring_flex+blazeds+java+spring后台消息推送,有界面维护
  4. 迷人的巴宝莉时装附件配置
  5. BT网络电视-Coolstreaming PPLive
  6. Lightbox弹出层插件:jQuery弹出层插件用法
  7. 计算机安装网络设置,打印机网络设置安装方法(通用全面)
  8. JAVA双大括号语法
  9. python-----即时标记 (读取文本)
  10. 智慧体育馆 3D 可视化,掀起城市建设新热潮