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. python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)

    一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...

  2. Signal ()函数详细介绍

    1. 功能 设置某一信号的对应动作 2. 声明 #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t si ...

  3. JDK1.7安装和环境配置

    进行Java或者Android开发,首先必须要搭建一个开发环境,先安装JDK,然后配置jdk环境变量.JDK现在的最高版本为JDK 1.8 ,如果我们要做Android开发,我们则需要JDK1.7以上 ...

  4. MySQL记录异常实体类设计

    public class LogInfo { /// <summary> /// 应用名 /// </summary> public string AppName { get; ...

  5. CSS的力量:用一个DIV画图

    这些图片都是用一个DIV绘制出来的,其实原理并不复杂. 这些图片都是由CSS绘制出来的,通过background-image叠加实现, 如蘑菇头的实现,通过 radial-gradient 径向渐变  ...

  6. Jquery 较好的效果

    仿google图片效果图片展示相册(jquery)的演示页面 产品相册展示插件slideshow多图可翻页 懒人建站 Jquery分享A Jquery分享B Jquery分享C Jquery分享D

  7. 关于An internal error occurred during: "Launching MVC on Tomcat 6.x". java.lang.NullPointerException异常处理

    一大早上来启动打开myeclipse就报一个这样的错误An internal error occurred during: "Launching MVC on Tomcat  6.x&quo ...

  8. Casperjs循环执行(重复执行不退出)

    var casper = require('casper').create({ // pageSettings: { // loadImages: true, // loadPlugins: fals ...

  9. VMware下centos桥接模式静态ip配置

    声明:本文转载自http://blog.csdn.net/ltr15036900300/article/details/48828207,非原创. 一.配置虚拟机centos网络 备份网络文件 [ro ...

  10. centos7系统下安装配置jdk、tomcat教程

    JDK安装与配置 1.下载linux版本的jdk,我下的版本是jdk6.0,下载rpm版本的. 可通过百度搜索文件名:jdk-6u45-linux-x64-rpm.bin下载 也可通过oracle官网 ...