牛客练习赛#105(A-D)
牛客练习赛#105
文章目录
- 牛客练习赛#105
- A.切蛋糕的贝贝
- B.抱歉,这没有集美
- C.打牌的贝贝
- D.点分治分点
A.切蛋糕的贝贝
题意
- 有一个正n边形,想通过下列的切法切成面积比为1:1:4:5:1:4的6块
- 切法:1,通过重心的对角线切一刀;2,重心与一个顶点切一刀
- 问这个n边形能否切成题目要求的6块,若能则输出切的次数
题解
- 小数论+思维。按照题目给定的切法,n边形有n个顶点,所以最多切成n块,这n块要分成面积比为114514的话,必须有n为16的倍数。
- n%16!=0时,无解。否则,只需要切5刀。方法为对半切成8:8,一边8对半切为4:4,另一个8切成1:1:1:5,总共5刀。
代码
#include <iostream>using namespace std;void solve() {int n; cin>>n;if(n%16) cout<<-1<<'\n';else cout<<5<<'\n';
}int main() {int t=1; //cin>>t;while(t--) solve();return 0;
}
B.抱歉,这没有集美
题意
- 对于n的排列数组a,问存在多少种排列存在gcd(ai, i)为偶数
题解
打表。逆向思维,求存在gcd为偶数的对立事件,即求事件总数-排列中gcd(ai, i)为奇数恒成立的事件数量。sum=n!,打表可知sub= { A( foolr( (n+1)/2 ) }^2.即res=sum-sub。
证明。如果ai为奇数那么放在哪个位置都可以,因为奇数因子不可能有偶数,所以不管与奇数还是偶数的gcd都不会是偶数;如果是偶数一定是放在奇数位置,才不会出现gcd为偶数。所以对于n讨论
n为奇数时,n+1/2个奇数位置中放n-1/2个偶数和1个奇数。所以gcd全为奇数的情况为
Cn+121×(n+12)!×(n−12)!=[(n+12)!]2C_{\frac{n+1}{2}}^{1}\times (\frac{n+1}{2})!\times (\frac{n-1}{2})!=[(\frac{n+1}{2})!]^2 C2n+11×(2n+1)!×(2n−1)!=[(2n+1)!]2n为偶数的情况,gcd全为奇数的情况数量
(n2)!×(n2)!=[(n2)!]2(\frac{n}{2})!\times (\frac{n}{2})!=[(\frac{n}{2})!]^2 (2n)!×(2n)!=[(2n)!]2
代码
#include <iostream>using namespace std;
const int mod=1e9+7;int main() {int n; cin>>n;int sum=1,sub=1;for(int i=1;i<=n;i++) sum=1ll*sum*i%mod;for(int i=1;i<=(n+1)/2;i++) sub=1ll*sub*i%mod;sub=1ll*sub*sub%mod;sum=(sum-sub+mod)%mod;cout<<sum<<'\n';return 0;
}
C.打牌的贝贝
题意
- 有2n张牌,其编号为1~2n,A和B都有随机的n张牌
- 游戏规则:每次都是A出一张牌,如果A没牌出那么A输;否则B需要出一张比A更大的牌,如果B出不了更大的牌,那么B输
- 问A和B各自赢的情况数量为多少
题解
- 组合数/卡特兰数。首先必须明确这不是博弈论,因为A B不是轮流先手的公平游戏。对于A出的一张牌,B只需出一张大的牌即可。那么在1~2n的排列中,把A手中的牌视为左括号,B视为右括号,1~2n为合法的括号序列就是B赢的数量,也就是卡特兰数。C(2n,n)-caltonla即为A赢的数量。
- 注意多组数据,不要在线算,预处理出来就行。还有我真的服了,卡cin不得好死
代码
#include <iostream>using namespace std;
const int mod=1e9+7,N=1e6+5,M=2e6+10;
typedef long long ll;ll fac[M],infac[M];ll qmi(ll a,ll b) {ll res=1;while(b) {if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}void init() {fac[0]=infac[0]=1;for(int i=1;i<M;i++) {fac[i]=fac[i-1]*i%mod;infac[i]=infac[i-1]*qmi(i,mod-2)%mod;}
}ll c(ll a,ll b) {return fac[a]*infac[b]%mod*infac[a-b]%mod;
}void solve() {ll n; cin>>n;ll res=c(2*n,n);ll ans=res*qmi(n+1,mod-2)%mod;res=(res-ans+mod)%mod;cout<<res<<' '<<ans<<'\n';
}int main(){init();ios::sync_with_stdio(false); cin.tie(0);int t; cin>>t;while(t--) solve();return 0;
}
D.点分治分点
题意
- 查找每个点到s的所有简单路径中,所有路径中最小值的最大值
题解
- 最短路。从s点跑一遍spfa之后,更新到的点就是有可到达路径的。要得到答案只需要在更新条件中做更改即可,更新方式如代码所示。
代码
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int N=1e5+10;int n,m,s,dist[N];
bool vis[N];
vector<PII> g[N];void add(int u,int v,int w) {g[u].push_back({v,w});
}void spfa() {memset(dist,-1,sizeof dist);queue<int> q;q.push(s); vis[s]=1; dist[s]=0x3f3f3f3f;while(q.size()) {int u=q.front(); q.pop();vis[u]=0;for(auto [v,w]:g[u]) if(dist[v]<min(dist[u],w)) {//min的含义为更新的是此条路径中的最小边权,而<才更新的意思是答案dist[v]求的是所有从s到v的路径中最大值dist[v]=min(dist[u],w);if(!vis[v]) q.push(v),vis[v]=1;}}
}int main() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin>>n>>m>>s;while(m--) {int u,v,w; cin>>u>>v>>w;if(u!=v) add(u,v,w);}spfa();for(int i=1;i<=n;i++) cout<<(dist[i]==0x3f3f3f3f ? -1:dist[i])<<' ';return 0;
}
牛客练习赛#105(A-D)相关推荐
- 牛客练习赛105(A切蛋糕的贝贝、B抱歉,这没有集美、D点分治分点)
A切蛋糕的贝贝 题目链接 关键点: 1.题目已经定下来了切的块数,即六块,且比例为1:1:4:5:1:4,那么只有刚刚好为题目要求的比例的倍数,才可以切.1+1+4+5+1+4 = 16,即为16的倍 ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛63 C.牛牛的揠苗助长
牛客练习赛63 C.牛牛的揠苗助长 题目链接 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号.2号-n号菜地,然后他往每块菜地中都种下了一些水稻,一开始 ...
- 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...
- 牛客练习赛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个查询, ...
- 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)
牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...
最新文章
- python字典用法(创建、添加、删除(del()、clear()、pop()、popitem())、修改、查找(get()、keys()、values()、items())、更新update、遍历)
- 94. 二叉树的中序遍历(迭代)
- 1.x到2.x的迁移:可观察与可观察:RxJava FAQ
- ElasticSearch IK 分词器快速上手
- lua是编译成c语言再执行嘛,go_lua_c: 使用go编译lua脚本为字节码,通过网络传给c,通过c执行lua脚本。...
- 剑指offer面试题11. 旋转数组的最小数字(二分查找)
- linux 生成2g文件吗,linux 32位系统 c++写大于2G文件
- mysql配置参数优化提示
- php huoqv 多选,镊噍虫刻蘖舌#joquycg
- 可视化大作业复习笔记
- Webshell管理工具
- 植物大战僵尸修改存档用户名、关卡、金钱说明
- Ubuntu使用WakeOnLan远程开机
- 使用计算机VLOOKUP函数需注意什么,lookup和vlookup的区别 计算机Excel中的lo...
- 笔记——数据归一化 scikit-learn中的Scaler
- linux openerp,openerp
- 麒麟Linux启动目录,Ubuntu Kylin优麒麟文件管理器篇:介绍,类别,结构,文件系统目录,使用...
- 微信小程序—页面内分享按钮用图标代替
- Redis遇到过的问题(Could not get a resource from the pool)
- Windows10家庭版怎么设置默认输入法
热门文章
- 软著php源程序,修改源码软著 源码修改软件
- Android Studio 常用快捷键
- Adopting a dog from a humane society
- 2016年 10 个最热门 IT 职业岗位
- 2019年中国进口澳洲坚果数量增长85%,其中97%来自澳洲本土
- android app显示机器人,Android app图标总是显示默认的机器人图标,且在manifest文件的application中修改无效......
- 计算机ct检查,什么是CT检查?CT检查设备介绍
- 记录一下公司uniapp项目安装node_modules失败问题
- JavaWeb购物车实现
- Oracle12cR1安装步骤及直连arcgis10.2.X