牛客练习赛 64——错排
A.怪盗-1412
111…1⏟⌊n2⌋444…4⏟m111…1⏟⌈n2⌉222…2⏟k\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lfloor \frac{n}{2} \rfloor \end {matrix}\begin{matrix} \underbrace{ 444\dots\ 4} \\ m \end{matrix}\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lceil \frac{n}{2} \rceil \end {matrix}\begin{matrix} \underbrace{ 222\dots\ 2} \\ k \end {matrix}111… 1⌊2n⌋444… 4m111… 1⌈2n⌉222… 2k
上述排列方式最优,由此根据组合数即可求解。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{IO;int T=1;cin>>T;while(T--){ll n,m,k;cin>>n>>m>>k;cout<<n/2*((n+1)/2)*m*k<<'\n';}return 0;
}
Dis2
与某个点距离为2的点有三种①父亲的父亲②儿子的儿子③兄弟节点
跑dfs统计以下即可
sz[u]
表示u
节点儿子的数量
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=200010,M=2*N;
int h[N],e[M],ne[M],idx;
int ans[N],sz[N];
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
int n;
void dfs(int u,int fa)
{for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;if(fa) {ans[fa]++;ans[j]++;}sz[u]++;dfs(j,u);}for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;ans[j]+=sz[u]-1;}
}
int main()
{IO;int T=1;//cin>>T;while(T--){memset(h,-1,sizeof h);cin>>n;for(int i=1;i<n;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);}dfs(1,0);for(int i=1;i<=n;i++) cout<<ans[i]<<'\n';}return 0;
}
C.序列卷积之和
一步一步推式子,预处理各种前缀和。真的无脑暴力
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010:
const ll mod=1e9+7;
ll a[N],b[N],c[N],d[N],e[N],f[N];
int n;
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) b[i]=(b[i-1]+a[i])%mod;for(int i=1;i<=n;i++) c[i]=(c[i-1]+a[i]*b[i-1]%mod)%mod;for(int i=1;i<=n;i++) d[i]=(d[i-1]+b[i]*b[i]%mod)%mod;for(int i=1;i<=n;i++) e[i]=(e[i-1]+b[i])%mod;for(int i=1;i<=n;i++) f[i]=(f[i-1]+c[i])%mod;ll res=0;for(int i=1;i<=n;i++) res=(res+d[n]-d[i-1]-b[i-1]*(e[n]-e[i-1])%mod-f[n]+f[i-1]+(n-i+1)*c[i-1]%mod)%mod;cout<<(res+mod)%mod<<'\n';}return 0;
}
D.宝石装箱
学习自大佬题解
首先先说一下错排,虽然我没做过错排,看到这个题首先想到如果每个箱子只对应一个不能放的宝石,那么直接可以容斥原理解决了,不过此题没有那么简单。看了上述文章学到错排还可以用递推方式解决这里记录一下。
状态表示:fif_ifi错排规模为iii时的方案数
状态计算:对于规模为iii的错排,考虑第iii个小球,不妨让第iii个小球放在了第j(1≤j<i)j(1\leq j<i)j(1≤j<i)个箱子里(第iii禁止放在第iii个箱子里),那么考虑第kkk个小球是否放在了第iii个箱子,如果放在了第iii个箱子那么很容易发现现在规模是i−2i-2i−2的错排方案,如果没有放在第iii个箱子里那么现在规模是i−1i-1i−1的错排方案,又因为kkk有i−1i-1i−1种选择那么可以得到递推式fi=(i−1)×(fi−1+fi−2)f_i=(i-1)×(f_{i-1}+f_{i-2})fi=(i−1)×(fi−1+fi−2)
经过一顿操作计算可得fn=n![12!−13!+⋯+(−1)n1n!]f_n=n![\frac{1}{2!}-\frac{1}{3!}+\dots+(-1)^n\frac{1}{n!}]fn=n![2!1−3!1+⋯+(−1)nn!1]
不难看出上式和容斥原理得出的答案相同。
容斥原理后现在需要求得至少{1,2,3,…,n}\{1,2,3,\dots,n\}{1,2,3,…,n}个盒子不合法的情况,直接上上述大佬题解结论:
状态表示:f(i,j)f_{(i,j)}f(i,j)对于只考虑前iii种盒子,jjj个盒子不合法的方案数
状态转移:考虑最后一步第iii个盒子是否合法易得出f(i,j)=f(i−1,j)+f(i−1,j−1)×cntif_{(i,j)}=f_{(i-1,j)}+f_{(i-1,j-1)}×cnt_if(i,j)=f(i−1,j)+f(i−1,j−1)×cnticnticnt_icnti是第iii个箱子不能放的小球数量
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=8010;
const ll mod=998244353;
ll f[2][N],fact[N];
int cnt[N],n;
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++){int a;cin>>a;cnt[a]++;}fact[0]=1;for(int i=1;i<=n;i++) fact[i]=fact[i-1]*i%mod;f[0][0]=f[1][0]=1;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)f[i&1][j]=(f[i-1&1][j]+f[i-1&1][j-1]*cnt[i]%mod)%mod;ll res=fact[n];for(int i=1,k=-1;i<=n;i++,k*=-1) res=(res+k*fact[n-i]*f[n&1][i])%mod;cout<<(res+mod)%mod<<'\n';}return 0;
}
这个dp太妙了吧,递推太精髓了。
E.红色的樱花
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=1e18;
ll n,m,d,sx,sy,ex,ey,a,b,c;
ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x=1,y=0;return a;}ll d=exgcd(b,a%b,y,x);y-=a/b*x;return d;
}
ll x,y;
ll calc(ll a,ll b,ll c,ll cost)
{ll gcd=exgcd(a,b,x,y);if(c%gcd) return INF;b/=gcd;if(b<0) b=-b;x=(c/gcd*x%b+b)%b;return x*cost;
}
int main()
{IO;int T=1;cin>>T;while(T--){cin>>n>>m>>d>>sx>>sy>>ex>>ey>>a>>b>>c;ll gcd=exgcd(n,m,x,y);if(sx==ex&&sy==ey) cout<<"0\n";else {ll res=calc(d,n,ex-sx+n,b)+calc(d,m,ey-sy,c);res=min(res,INF);ll gcd=exgcd(n,m,x,y);res=min(res,calc(d,gcd,ex-ey+sy-sx,b)+a);res=min(res,calc(d,gcd,ey-ex+sx-sy,c)+a);if(res==INF) cout<<-1<<'\n';else cout<<res<<'\n';}}return 0;
}
牛客练习赛 64——错排相关推荐
- 牛客练习赛64 - A.怪盗-1412(排列组合,简单数学)
链接:https://ac.nowcoder.com/acm/contest/5633/A 来源:牛客网 示例1 输入 3 6 7 8 1 2 2 6 0 3 输出 504 0 0 备注: 1< ...
- 牛客练习赛64 - B Dis2(树,基础图论)
B Dis2 其实就是对于每一个结点,答案就是这个结点的每一个子结点的子结点数−1-1−1(因为这里使用邻接表实现树,是一个无向图双向建边,子结点的子结点包括自己) #include<iostr ...
- 踩不出足迹(牛客练习赛88 )
踩不出足迹(牛客练习赛88 ) 题意: 长度为n的数组a,每个数是一个k位二进制 定义一下操作: 令第一次得到的结果为 a1a_1a1.你需要从第二个数开始,每次可以选择与上一次得到的结果异或或者同 ...
- 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛34 E little w and Digital Root(数位dp)
title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...
- 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- 牛客练习赛73 D 离别(线段树+右端点排序离线查询)
牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...
最新文章
- 关于arduino和zigbee串口16进制通信问题
- 设计模式(策略模式)
- Kubernetes — 调度系统
- python编程自学能学会吗-自学Python会有什么困难?老男孩自学python编程
- 遇到问题为何该自己动手
- .net framework开发winform_这个Winform的UI库也太全了!四十多个控件都在这一个项目里了...
- 99%的面试官都会问到的Java面试题
- SAP License:无师自通学SAP-开篇
- DEEPNOVA 技术荟系列公开课回顾:释放海量数据价值,尽显数据智能之美
- python 生孩子朋友圈_生娃报喜朋友圈文案 孩子出生发朋友圈的话
- 程序员教你十分钟做出炫酷桌面
- 中国5级省市编码爬去整理(统计用区划和城乡划分代码)
- javaweb网上商城系统
- 51单片机游戏(推箱子)
- SAS用proc means和proc univariate求数据的样本均值、中位数、四分位数、样本方差、极差、变异系数、二阶、三阶和四阶中心矩、偏度、峰度、标准差和对数据进行正态性检验
- 云计算面试题及答案,云计算工程师面试题集锦
- 完全依赖XP必将自食其果
- Python中求矩阵的逆
- 软件测试面试题:什么是断言和验证?
- 51单片机STC 89C52RC进阶 – 自制8x8点阵、点亮单颗LED、显示点阵汉字
热门文章
- winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...
- lol战绩查询接口_LOL:莫名其妙被封号?3把躺赢局被说是代打
- 怎么判断再一个局域网内一个ip被两台机器占用_交换机与 VLAN 到底是怎么来的...
- c++随机数函数rand()
- [Java基础]多态基础
- [蓝桥杯2016初赛]密码脱落
- 数据结构与算法--B树原理及实现
- mpu 配置内存空间_mpu内存保护单元功能及工作原理
- 批量将PPM格式图片转化为JPG格式
- 单片机课程设计数字心率计_如何选购合适的PH计