牛客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\). ...
随机推荐
- SpringBoot Logback日志配置
Logback的配置介绍: 1.Logger.appender及layout Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型.级别. ...
- CF876 F 思维 枚举
给你n个数,问有几个区间满足,区间内或操作大于区间内的任意数. 首先可以知道,两数或操作的结果必定不会小于两者间的最大值,也就是说对于一个区间中,不合法的状态只有两值或相等.那么我们可以考虑枚举每个数 ...
- 最好用的xshell替代软件----FinalShell工具
2017年8月份NetSarang公司旗下软件家族的官方版本被爆被植入后门着实让我们常用的Xshell,Xftp等工具火了一把,很长时间都是在用Xshell,不过最近发现了一款同类产品FinalShe ...
- [整] Android ListView 去除边缘阴影、选中色、拖动背景色等
以下是通过XML定义的方式实现,如果需要通过代码实现,找到对应是set方式设置即可. 去除ListView滑到顶部和底部时边缘的黑色阴影: android:fadingEdge="none& ...
- ML—R常用多元统计分析包(持续更新中……)
基本的R包已经实现了传统多元统计的很多功能,然而CRNA的许多其它包提供了更深入的多元统计方法,下面要综述的包主要分为以下几个部分: 1) 多元数据可视化(Visualising multivaria ...
- 分布式文件系统 之 数据块(Block)
众所周知,HDFS中以数据块(block)为单位进行存储管理.本文简单介绍一下HDFS中数据块(block)的概念,以及众多分布式存储系统(不止是HDFS)使用block作为存储管理基本单位的意义. ...
- 【转】UICollectionView使用介绍
CHENYILONG Blog UICollectionView 使用介绍 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/lu ...
- deeplearning.ai学习seq2seq模型
一.seq2seq架构图 seq2seq模型左边绿色的部分我们称之为encoder,左边的循环输入最终生成一个固定向量作为右侧的输入,右边紫色的部分我们称之为decoder.单看右侧这个结构跟我们之前 ...
- C#中的GetElementsByClassName方法
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public static class Spread { ...
- Ubuntu 12.04 安装Tomcat7
1.下载Tomcat7 打开Tomcat官网 http://tomcat.apache.org,在左边的导航栏的“Download"中找到Tomcat7.0目录,点击后进入Tomcat7的页 ...