A - 数字权重

题目大意:

一个\(n\)位的数字。设第\(i\)位的数为\(a_i\),其中\(a_1\)为最高位,\(a_n\)为最低位,\(k\)为给定的数字。求同时满足满足以下两个条件的数的个数:

  1. 不含前导\(0\);
  2. \(\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游记的更多相关文章

  1. 【牛客OI赛制测试赛3】 毒瘤xor

    牛客OI赛制测试赛3 毒瘤xor 传送门 题面,水表者自重 Solution 前缀和简单题(挖坑待补) 代码实现 #include<stdio.h> #define int long lo ...

  2. 牛客OI赛制测试赛2(0906)

    牛客OI赛制测试赛2(0906) A :无序组数 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序意思就是(a,b)和(b,a) 算一组. 输入描述: ...

  3. 牛客OI赛制测试赛2

    A题: https://www.nowcoder.com/acm/contest/185/A 链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题 ...

  4. 8.30 牛客OI赛制测试赛1 F题 子序列

    题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数.对于每组数据,第一行两个整数N,k,含义如题所 ...

  5. C数列下标 牛客OI赛制测试赛2

    链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 给出一个数列 A,求出一个数列B. 其中Bi   表示 数列A中 Ai 右边第一个比 Ai 大的 ...

  6. 牛客OI赛制测试赛2 D 星光晚餐

    链接:https://www.nowcoder.com/acm/contest/185/D来源:牛客网 题目描述 Johnson和Nancy要在星光下吃晚餐.这是一件很浪漫的事情. 为了增加星光晚餐那 ...

  7. 牛客OI赛制测试赛2 C 数组下标

    链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 题目描述 给出一个数列 A,求出一个数列B. 其中Bi   表示 数列A中 Ai 右边第一个比 ...

  8. 牛客OI赛制测试赛2 A 无序组数

    链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序 ...

  9. Nowcoder | [题解-N189]牛客OI赛制测试赛3

    这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...

随机推荐

  1. 干货:制作科研slide简明规范

  2. JMS学习(六)--提高非持久订阅者的可靠性 以及 订阅恢复策略

    一,非持久订阅者 和 实时消费消息 在这篇文章中区分了Domain为Pub/Sub.Destination为Topic时,消费者有两种:持久订阅者 和 非持久订阅者. 对于持久订阅者而言,只要订阅了某 ...

  3. 在Emacs中启用Fcitx输入法

    安装fcitx输入法,在 ~/.xinitrc文件中添加如下内容 (我用startx启动图形环境,所以在~/.xinitrc中配置X会话) export LC_CTYPE="zh_CN.UT ...

  4. BZOJ4818 序列计数

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...

  5. swift中Any,AnyObject,AnyClass的区别

    这几个概念让人很迷惑,看了很多帖子,终于搞明白了,简单总结: Any 和 AnyObject 是 Swift 中两个妥协的产物.什么意思呢,oc中有个id关键字,表示任何对象,oc和swift混编的时 ...

  6. 关于如何在Python中使用静态、类或抽象方法的权威指南

    Python中方法的工作方式 方法是存储在类属性中的函数,你可以用下面这种方式声明和访问一个函数 >>> class Pizza(object): ... def __init__( ...

  7. asp.net mvc 根据路由生成正确的url

    假设存在这样一段路由配置: routes.MapRoute( name: "ProductList1_01", url: "pl/{bigSortId}_{smallSo ...

  8. 如何使用gifsicle压缩gif图片

    最近我写了一些关于如何将各种形式的多媒体格式相互转换的文章,特别是GIF动图方面的,比如如何将小视频转换成GIF动图或将GIF动图转换成视频,有很多像ImageMagick,ffmpeg这样的工具帮助 ...

  9. Linux获取/dev/input目录下的event对应的设备【转】

    转自:https://blog.csdn.net/qq_21792169/article/details/51458855 当我们在Linux操作系统下使用input子系统时,当我们先插鼠标,在插上摄 ...

  10. LCT摘要

    介绍.用途 LCT是树链剖分中的一种,又叫实链剖分.动态树,常用于维护动态的树.森林. 维护方式 LCT并不直接维护原树,而是用一堆splay作为辅助树来维护.原树中的一条实链上的点在一棵splay中 ...