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… 4​m​111… 1​⌈2n​⌉​222… 2​k​
上述排列方式最优,由此根据组合数即可求解。

#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)​×cnti​cnticnt_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.红色的樱花

待补——2020/9/23补
大佬题解
扩展欧几里得可以求出正整数a,ba,ba,b满足ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)一组特解{x=x0y=y0\begin{cases} x=x_0 \\y=y_0\end{cases}{x=x0​y=y0​​,通解是{x=x0+kbgcd(a,b)y=y0−kagcd(a,b)\begin{cases} x=x_0+\frac{kb}{gcd(a,b)} \\y=y_0-\frac{ka}{gcd(a,b)}\end{cases}{x=x0​+gcd(a,b)kb​y=y0​−gcd(a,b)ka​​


本人在看上述题解的时候不明白如何判断两点是否在同一个循环中于时自己推了一下:{sx+?=k1n+exsy+?=k2m+ey\begin{cases} s_x+?=k_1n+e_x \\s_y+?=k_2m+e_y\end{cases}{sx​+?=k1​n+ex​sy​+?=k2​m+ey​​两式子作差可得sx−sy−(ex−ey)=k1n+(−k2)m=kgcd(n,m)s_x-s_y-(e_x-e_y)=k_1n+(-k_2)m=kgcd(n,m)sx​−sy​−(ex​−ey​)=k1​n+(−k2​)m=kgcd(n,m)
由此推出sx−sy−(ex−ey)≡0(gcd(n,m))s_x-s_y-(e_x-e_y)\equiv0 (gcd(n,m))sx​−sy​−(ex​−ey​)≡0(gcd(n,m))
因此只要满足上述式子,就能保证两点在同一循环中。

那么如何通过操作二使得不在同一个循环的两点处在同一循环?
{sx+xd=k1n+exsy=k2m+ey\begin{cases} s_x+xd=k_1n+e_x \\s_y=k_2m+e_y\end{cases}{sx​+xd=k1​n+ex​sy​=k2​m+ey​​两式子作差可得sx−sy−(ex−ey)+xd=k1n+(−k2)m=ygcd(n,m)s_x-s_y-(e_x-e_y)+xd=k_1n+(-k_2)m=ygcd(n,m)sx​−sy​−(ex​−ey​)+xd=k1​n+(−k2​)m=ygcd(n,m)进一步化简可得
xd+ygcd(n,m)=ex−ey−(sx−sy)xd+ygcd(n,m)=e_x-e_y-(s_x-s_y)xd+ygcd(n,m)=ex​−ey​−(sx​−sy​)由此用扩展欧几里得求出最小正整数xxx即可。

#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——错排相关推荐

  1. 牛客练习赛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< ...

  2. 牛客练习赛64 - B Dis2(树,基础图论)

    B Dis2 其实就是对于每一个结点,答案就是这个结点的每一个子结点的子结点数−1-1−1(因为这里使用邻接表实现树,是一个无向图双向建边,子结点的子结点包括自己) #include<iostr ...

  3. 踩不出足迹(牛客练习赛88 )

    踩不出足迹(牛客练习赛88 ) 题意: 长度为n的数组a,每个数是一个k位二进制 定义一下操作: 令第一次得到的结果为 a1a_1a1​.你需要从第二个数开始,每次可以选择与上一次得到的结果异或或者同 ...

  4. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  5. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  6. 牛客练习赛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 ...

  7. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  8. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  9. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

最新文章

  1. 关于arduino和zigbee串口16进制通信问题
  2. 设计模式(策略模式)
  3. Kubernetes — 调度系统
  4. python编程自学能学会吗-自学Python会有什么困难?老男孩自学python编程
  5. 遇到问题为何该自己动手
  6. .net framework开发winform_这个Winform的UI库也太全了!四十多个控件都在这一个项目里了...
  7. 99%的面试官都会问到的Java面试题
  8. SAP License:无师自通学SAP-开篇
  9. DEEPNOVA 技术荟系列公开课回顾:释放海量数据价值,尽显数据智能之美
  10. python 生孩子朋友圈_生娃报喜朋友圈文案 孩子出生发朋友圈的话
  11. 程序员教你十分钟做出炫酷桌面
  12. 中国5级省市编码爬去整理(统计用区划和城乡划分代码)
  13. javaweb网上商城系统
  14. 51单片机游戏(推箱子)
  15. SAS用proc means和proc univariate求数据的样本均值、中位数、四分位数、样本方差、极差、变异系数、二阶、三阶和四阶中心矩、偏度、峰度、标准差和对数据进行正态性检验
  16. 云计算面试题及答案,云计算工程师面试题集锦
  17. 完全依赖XP必将自食其果
  18. Python中求矩阵的逆
  19. 软件测试面试题:什么是断言和验证?
  20. 51单片机STC 89C52RC进阶 – 自制8x8点阵、点亮单颗LED、显示点阵汉字

热门文章

  1. winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...
  2. lol战绩查询接口_LOL:莫名其妙被封号?3把躺赢局被说是代打
  3. 怎么判断再一个局域网内一个ip被两台机器占用_交换机与 VLAN 到底是怎么来的...
  4. c++随机数函数rand()
  5. [Java基础]多态基础
  6. [蓝桥杯2016初赛]密码脱落
  7. 数据结构与算法--B树原理及实现
  8. mpu 配置内存空间_mpu内存保护单元功能及工作原理
  9. 批量将PPM格式图片转化为JPG格式
  10. 单片机课程设计数字心率计_如何选购合适的PH计