牛客练习赛#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+1​1​×(2n+1​)!×(2n−1​)!=[(2n+1​)!]2

      • n为偶数的情况,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)相关推荐

  1. 牛客练习赛105(A切蛋糕的贝贝、B抱歉,这没有集美、D点分治分点)

    A切蛋糕的贝贝 题目链接 关键点: 1.题目已经定下来了切的块数,即六块,且比例为1:1:4:5:1:4,那么只有刚刚好为题目要求的比例的倍数,才可以切.1+1+4+5+1+4 = 16,即为16的倍 ...

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

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

  3. 牛客练习赛63 C.牛牛的揠苗助长

    牛客练习赛63 C.牛牛的揠苗助长 题目链接 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号.2号-n号菜地,然后他往每块菜地中都种下了一些水稻,一开始 ...

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

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

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

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

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

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

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

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

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

  9. 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)

    牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...

最新文章

  1. python字典用法(创建、添加、删除(del()、clear()、pop()、popitem())、修改、查找(get()、keys()、values()、items())、更新update、遍历)
  2. 94. 二叉树的中序遍历(迭代)
  3. 1.x到2.x的迁移:可观察与可观察:RxJava FAQ
  4. ElasticSearch IK 分词器快速上手
  5. lua是编译成c语言再执行嘛,go_lua_c: 使用go编译lua脚本为字节码,通过网络传给c,通过c执行lua脚本。...
  6. 剑指offer面试题11. 旋转数组的最小数字(二分查找)
  7. linux 生成2g文件吗,linux 32位系统 c++写大于2G文件
  8. mysql配置参数优化提示
  9. php huoqv 多选,镊噍虫刻蘖舌#joquycg
  10. 可视化大作业复习笔记
  11. Webshell管理工具
  12. 植物大战僵尸修改存档用户名、关卡、金钱说明
  13. Ubuntu使用WakeOnLan远程开机
  14. 使用计算机VLOOKUP函数需注意什么,lookup和vlookup的区别 计算机Excel中的lo...
  15. 笔记——数据归一化 scikit-learn中的Scaler
  16. linux openerp,openerp
  17. 麒麟Linux启动目录,Ubuntu Kylin优麒麟文件管理器篇:介绍,类别,结构,文件系统目录,使用...
  18. 微信小程序—页面内分享按钮用图标代替
  19. Redis遇到过的问题(Could not get a resource from the pool)
  20. Windows10家庭版怎么设置默认输入法

热门文章

  1. 软著php源程序,修改源码软著 源码修改软件
  2. Android Studio 常用快捷键
  3. Adopting a dog from a humane society
  4. 2016年 10 个最热门 IT 职业岗位
  5. 2019年中国进口澳洲坚果数量增长85%,其中97%来自澳洲本土
  6. android app显示机器人,Android app图标总是显示默认的机器人图标,且在manifest文件的application中修改无效......
  7. 计算机ct检查,什么是CT检查?CT检查设备介绍
  8. 记录一下公司uniapp项目安装node_modules失败问题
  9. JavaWeb购物车实现
  10. Oracle12cR1安装步骤及直连arcgis10.2.X