牛客OI赛制测试赛3游记
A - 数字权重
题目大意:
一个\(n\)位的数字。设第\(i\)位的数为\(a_i\),其中\(a_1\)为最高位,\(a_n\)为最低位,\(k\)为给定的数字。求同时满足满足以下两个条件的数的个数:
- 不含前导\(0\);
- \(\sum_{i=2}^n(a_i-a_{i-1})=k\)。
\(n,|k|\le10^{13}\)。
思路:
对和式稍加变形得\(a_n-a_1=k\),因此我们只需要考虑\(a_1\)和\(a_n\),其余数位\(0\sim 9\)随便放即可。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
using int64=long long;
inline int64 getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int64 x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
constexpr int mod=1e9+7;
inline int power(int a,int64 k) {
int ret=1;
for(;k;k>>=1) {
if(k&1) ret=(int64)ret*a%mod;
a=(int64)a*a%mod;
}
return ret;
}
int main() {
const int64 n=getint(),k=getint();
if(std::abs(k)>9) {
puts("0");
return 0;
}
int ans=power(10,n-2);
if(k>=0) ans=ans*(9-k)%mod;
if(k<0) ans=ans*(10+k)%mod;
printf("%d\n",ans);
return 0;
}
B - 毒瘤xor
同CC-XXOR。
C - 硬币游戏
题目大意:
A和B各有一行长度为\(2n(n\le10^6)\)的01序列,A先取,每次只能取两个人之前都没取过的位置,这样\(n\)次后两个人就得到了长度为\(n\)的数字串,谁的字典序大谁就赢了。若两人都按照最优策略,问最后谁赢(或平手)。
思路:
每次贪心取未被选择位置上的\(1\),如果有很多\(1\)那么优先取对方也是\(1\)的。用堆来维护,时间复杂度\(\mathcal O(n\log n)\)。
源代码:
#include<queue>
#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
inline bool getval() {
register char ch;
while(!isalpha(ch=getchar()));
return ch=='U';
}
const int N=2e6+1;
bool a[N],b[N],mark[N];
struct Node {
bool a,b;
int id;
bool operator < (const Node &rhs) const {
if(a^rhs.a) return !a;
if(b^rhs.b) return !b;
return id<rhs.id;
}
};
std::priority_queue<Node> q[2];
int main() {
const int n=getint();
for(register int i=1;i<=n*2;i++) a[i]=getval();
for(register int i=1;i<=n*2;i++) b[i]=getval();
for(register int i=1;i<=n*2;i++) {
q[0].push((Node){a[i],b[i],i});
q[1].push((Node){b[i],a[i],i});
}
for(register int i=1;i<=n;i++) {
while(mark[q[0].top().id]) q[0].pop();
a[i]=q[0].top().a;
mark[q[0].top().id]=true;
while(mark[q[1].top().id]) q[1].pop();
b[i]=q[1].top().a;
mark[q[1].top().id]=true;
}
for(register int i=1;i<=n;i++) {
if(a[i]==b[i]) continue;
puts(a[i]?"clccle trl!":"sarlendy tql!");
return 0;
}
puts("orz sarlendy!");
return 0;
}
D - 粉樱花之恋
题目大意:
求斐波那契数列前\(n(n\le10^{18})\)项和。
思路:
找规律可以发现前\(n\)项和\(F(n)=f(n+3)-1\),因此直接矩阵快速幂或者折半公式即可。
时间复杂度\(\mathcal O(n\log n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<unordered_map>
using int64=long long;
inline int64 getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int64 x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int64 mod=998244353;
std::unordered_map<int64,int> m;
inline int64 sqr(const int64 &x) {
return x*x;
}
int64 f(const int64 &n) {
if(m[n]) return m[n];
if(n==1||n==2) return m[n]=1;
if(n&1) return m[n]=(sqr(f(n/2+1))+sqr(f(n/2)))%mod;
return m[n]=(f(n/2-1)*2+f(n/2))*f(n/2)%mod;
}
int main() {
printf("%lld\n",f(getint()+3)-1);
return 0;
}
E - 符合条件的整数
题目大意:
求\([2^n,2^m)(n,m\le65)\)内满足\(x\equiv1\pmod{7}\)的\(x\)个数。
思路:
使用__int128
直接算即可。
源代码:
#include<cstdio>
#include<cctype>
#include<iostream>
typedef unsigned __int128 uint128;
std::ostream &operator <<(std::ostream &os,const uint128 &x) {
if(x>=10) os<<x/10;
return os<<int(x%10);
}
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
int main() {
const int n=getint(),m=getint();
std::cout<<(((uint128)1<<m)-2)/7-(((uint128)1<<n)-2)/7<<std::endl;
return 0;
}
F - 可爱即正义
题目大意:
给你一个字符串\(s\),问是否能通过交换两个字符使得其不包括suqingnianloveskirito
作为子串。
思路:
哈希以后统计suqingnianloveskirito
的出现次数,并记录出现位置,分情况讨论即可。
源代码:
明明很多锅(比如\(cnt=0\)时交换前两个可能产生新的suqingnianloveskirito
),但还是过了。
#include<cstdio>
#include<cstring>
using uint64=unsigned long long;
const int N=1e6+2,base=31;
char s[N];
const char t[23]="\0suqingnianloveskirito";
uint64 hash[N],pwr[N],tmp;
int pos[N];
inline uint64 calc(const int &i) {
return hash[i]-hash[i-21]*pwr[21];
}
int main() {
scanf("%s",&s[1]);
const int n=strlen(&s[1]);
if(n==1) {
puts("No");
return 0;
}
for(register int i=pwr[0]=1;i<=n;i++) {
pwr[i]=pwr[i-1]*base;
hash[i]=hash[i-1]*base+s[i]-'a'+1;
}
for(register int i=1;i<=21;i++) {
tmp=tmp*base+t[i]-'a'+1;
}
int cnt=0;
for(register int i=1;i<=n;i++) {
if(i>=21&&calc(i)==tmp) {
pos[++cnt]=i;
}
}
if(cnt==0) {
puts("Yes\n1 2\n");
return 0;
}
if(cnt==1) {
puts("Yes");
printf("%d %d\n",pos[1],pos[1]-1);
return 0;
}
if(cnt==2) {
puts("Yes");
printf("%d %d\n",pos[1],pos[2]-1);
return 0;
}
puts("No");
return 0;
}
牛客OI赛制测试赛3游记的更多相关文章
- 【牛客OI赛制测试赛3】 毒瘤xor
牛客OI赛制测试赛3 毒瘤xor 传送门 题面,水表者自重 Solution 前缀和简单题(挖坑待补) 代码实现 #include<stdio.h> #define int long lo ...
- 牛客OI赛制测试赛2(0906)
牛客OI赛制测试赛2(0906) A :无序组数 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序意思就是(a,b)和(b,a) 算一组. 输入描述: ...
- 牛客OI赛制测试赛2
A题: https://www.nowcoder.com/acm/contest/185/A 链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题 ...
- 8.30 牛客OI赛制测试赛1 F题 子序列
题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数.对于每组数据,第一行两个整数N,k,含义如题所 ...
- C数列下标 牛客OI赛制测试赛2
链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 给出一个数列 A,求出一个数列B. 其中Bi 表示 数列A中 Ai 右边第一个比 Ai 大的 ...
- 牛客OI赛制测试赛2 D 星光晚餐
链接:https://www.nowcoder.com/acm/contest/185/D来源:牛客网 题目描述 Johnson和Nancy要在星光下吃晚餐.这是一件很浪漫的事情. 为了增加星光晚餐那 ...
- 牛客OI赛制测试赛2 C 数组下标
链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 题目描述 给出一个数列 A,求出一个数列B. 其中Bi 表示 数列A中 Ai 右边第一个比 ...
- 牛客OI赛制测试赛2 A 无序组数
链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序 ...
- Nowcoder | [题解-N189]牛客OI赛制测试赛3
这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...
随机推荐
- html5 canvas 垂直渐变描边
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [整理]zepto的初次使用
http://www.css88.com/doc/zeptojs_api/ http://chaoskeh.com/blog/some-experience-of-using-zepto.html
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- linux网络编程--Circular Buffer(Ring Buffer) 环形缓冲区的设计与实现【转】
转自:https://blog.csdn.net/yusiguyuan/article/details/18368095 1. 应用场景 网络编程中有这样一种场景:需要应用程序代码一边从TCP/IP协 ...
- 细说MySQL备份的基本原理(系列一 ) 备份与锁
数据库作为一个系统中唯一或者主要的持久化组件,对服务的可用性和数据的可靠性要求极高. 作为能够有效应对因为系统软硬件故障.人工误操作导致数据丢失的预防手段,备份是目前最为常见的数据库运维操作. 考虑到 ...
- java 编译与运行
javac 编译 .java文件 javac file.java //将file.java 编译为 file.classjavac -d folder file.java //将file.java ...
- 删除oracle 表中重复数据sql语句、保留rowid最小的一条记录
delete from tablename a where rowid > ( select min(rowid) from table_name b where b.id = a.id and ...
- 基于用Path.Combine的优化
Path.Combine: 什么时候会用到Path.Combine呢?,当然是连接路径字符串的时候! 所以下面的代码可以完美的工作: public static void Main() { strin ...
- 体会 git 之优越性
既生瑜,何生亮.已有subversion,何需git?先有firefox叱咤一时,何需chrome来搅局? 原本以为之前的解决方案已经能够满足现时的需求,但这是真正的事实吗?直到新颖的工具降临,才惊叹 ...
- 利用 Vmware 安装 Linux 虚拟机
之前写过一篇利用MS系的 Hyper-v 安装 Ubuntu 的教程,这里给出使用 Vmware 安装 Linux 的教程.(ps:Hyper-v 的体验感不太好,而且不够大众化) 1.准备工作 1. ...