前话:

  话说考试描述:普及难度。

  于是想在这场比赛上涨点信心。

  考出来的结果:Point:480     Rank:40

  然而同机房的最好成绩是 510。

  没考好啊!有点炸心态,D题一些细节没有注意,然后B题简单的贪心没有想到,GG~再给我30分钟我能AK!

A题:数字权重

题目描述

小a有一个n位的数字,但是它忘了各个位上的数是什么,现在请你来确定各个位上的数字,满足以下条件:
设第i位的数为ai,其中a1为最高位,an为最低位,K为给定的数字

1. 不含前导0
2.

请你求出满足条件的方案数

输入描述:

两个整数N, K

若存在无解的情况,请输出0

输出描述:

一个整数表示答案,对10

9

 + 7取模
示例1

输入

2 3

输出

6

说明

满足条件的数有:14, 25, 36, 47, 58, 69
示例2

输入

2 -3

输出

7

说明

满足条件的数有:41, 52, 63, 74, 85, 96, 30
示例3

输入

4 3

输出

600

说明

可能的方案有:1234, 1334
示例4

输入

4 -3

输出

700

备注:

对于30%的数据:n, |k| = 5
对于60%的数据:n, |k| ≤ 1000
对于100%的数据:n, |k| ≤ 1013
保证n > 1
 
Solution:
  本题简单数学,送分到位。
  公式$\sum_\limits{i=2}^{i\leq n}{a_i-a_{i-1}}=a_n-a_1=k$,于是我们只需考虑首尾的方案数,然后中间$n-2$位的方案数就是$10^{n-2}$,两者乘积就是答案了,注意细节第一位不能为0就好了。
代码:
/*Code by 520 -- 10.12*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const ll mod =1e9+;
ll n,k; ll Exp(ll s,ll k){
ll ans=;
s%=mod;
while(k){
if(k&) ans=ans*s%mod;
k>>=;
s=s*s%mod;
}
return ans;
} int main(){
cin>>n>>k;
if(k>=&&k<) printf("%lld\n",1ll*(-k)*Exp(,n-)%mod);
else if(k<&&k>-)printf("%lld\n",1ll*(+k)*Exp(,n-)%mod);
else cout<<;
return ;
}

B题:毒瘤XOR

题目描述

小a有N个数a1, a2, ..., aN,给出q个询问,每次询问给出区间[L, R],现在请你找到一个数X,使得
1、
2、最大,表示异或操作(不懂的请自行百度)

输入描述:

第一行一个整数N,表示序列的长度
第二行N个整数,表示序列内的元素
第三行一个整数q,表示询问的个数
接下来q行,每行两个整数[L, R],表示询问的区间

输出描述:

输出q行,每行一个整数表示答案

若有多组可行解,请输出较小的解
示例1

输入

5
4 78 12 1 3
3
2 5
1 4
3 3

输出

2147483632
2147483635
2147483635

备注:

对于30%的数据,n , q ≤ 10
对于60%的数据,n , q ≤ 1000
对于100%的数据,n, q ≤ 105
保证ai < 231
 
Solution:
  本题我GG了,咕咕。
  其实思路很简单,我们直接贪心就好。
  将二进制每位的1出现情况构建前缀和,然后对于每次查询区间$[l,r]$,先取出$[l,r]$的二进制分布情况,然后从高位到低位,贪心的判断$x$在该位上的取值。
  具体来说,对于当前位,因为我们要使$x$尽可能与更多的数在该位上不同(基于异或运算),所以若当前位为1的数小于区间长度的一半,则$x$当前位为$1$,否则为$0$,这样就能使当前位异或后产生大于等于区间长度一半的1,显然这样的$x$与每个数异或后求和会最大。
  时间复杂度$O(31*q)$。
代码:
/*Code by 520 -- 9.12*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,m,a,sum[N][]; il int solve(int l,int r){
int tot[],num=,mid=(r-l+)/;
For(i,,) tot[i]=sum[r][i]-sum[l-][i];
Bor(i,,) if(tot[i]<mid) num+=(<<i);
return num;
} int main(){
scanf("%d",&n);
For(i,,n) {
scanf("%d",&a);
For(j,,) if(<<j&a) sum[i][j]++;
For(j,,) sum[i][j]+=sum[i-][j];
}
int l,r;
scanf("%d",&m);
while(m--){
scanf("%d%d",&l,&r);
printf("%d\n",solve(l,r));
}
return ;
}

C题:硬币游戏

题目描述

 有一天clccle在机房里和sarlendy玩游戏,游戏的规则是这样的,在clccle和sarlendy的面前有两行长度为2n的硬币序列,共4n枚硬币,从clccle开始取,每次只能取两个人之前都没取过的位置的硬币,如果所取硬币朝上(U)的话记为1,所取硬币朝下(D)的话记为0,这样n次后两个人就得到了长度为n的数字串,谁的数字大谁就赢了,当然也存在平局的情况,当然这两个人都非常的睿智,现在clccle想知道,Ta有没有必胜策略?如果有的话就输出“clccle trl!”,没有的话输出“sarlendy tql!”,特别的,平局输出“orz sarlendy!”。

输入描述:

第一行,一个数字n(N<=1000000)
第二,三行,每行各一个长度为2n的字符串

输出描述:

一行 输出   clccle trl!或sarlendy tql!或orz sarlendy!
示例1

输入

3
UDUDUU
DUDUUD

输出

clccle trl!

说明

clccle先取5,sarlendy取4,clccle取6,sarlendy取2,clccle取1,sarlendy取3
此时clccle得到的数字为111,sarlendy得到的数字为110
因为111>110 所以说输出clccle trl!

备注:

不保证数据有梯度(但肯定没有极限数据)

Solution:

  本题纯贪心模拟。

  我们以$UU$表示同一位置都为$U$的个数,$Ua$表示a单独的$U$的个数,$Ub$表示b单独的$U$个数。

  先判断$UU$个数奇偶的情况:

    当$UU$为奇时,若$Ua>=Ub$则a赢,若$Ua+1=Ub$则平局,否则b赢。

    当$UU$为偶时,若$Ua>Ub$则a赢,若$Ua==Ub$或者$Ua==0,Ub==1$则平局,否则b赢。

代码:

/*Code by 520 -- 9.12*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,ua,ub,tt;
char s[N],t[N]; int main(){
scanf("%d%s%s",&n,s+,t+);
For(i,,n<<){
if(s[i]=='U'&&t[i]=='U') tt++;
else if(s[i]=='U'&&t[i]!='U') ua++;
else if(s[i]!='U'&&t[i]=='U') ub++;
}
if(tt&&&ua>=ub) puts("clccle trl!"),exit();
if(tt&&&ub-ua==) puts("orz sarlendy!"),exit();
if(tt&) puts("sarlendy tql!"),exit();
if(ua>ub) puts("clccle trl!"),exit();
if(ua==ub||!ua&&ub==) puts("orz sarlendy!"),exit();
puts("sarlendy tql!");
return ;
}

D题:粉樱花之恋

题目描述

qn是个特别可爱的小哥哥,qy是个特别好的小姐姐,他们两个是一对好朋友 [ cp (划掉~)
又是一年嘤花烂漫时,小qn于是就邀请了qy去嘤花盛开的地方去玩。当qy和qn来到了田野里时,qy惊奇的发现,嘤花花瓣以肉眼可见的速度从树上长了出来。
仔细看看的话,花瓣实际上是以一定规律长出来的,而且,每次张成新的花瓣的时候,上一次的花瓣就会都落到地上,而且不会消失。
花瓣生长的规律是,当次数大于等于2时,第i次长出来的花瓣个数和上一次张出来的花瓣个数的差是斐波那契数列的第i-1项。初始的时候地上没有花瓣,树上的花瓣个数为1,第一次生长的花瓣个数为1。初始的那个花瓣就落到了地上

现在,小qn想知道,经过k次生长之后,树上和地上的总花瓣个数是多少?
ps:斐波那契数列:
    f[1]=f[2]=1;f[i]=f[i-1]+f[i-2] (i>=2且i   N+

输入描述:

一行一个数k

输出描述:

一行一个数m,表示第k次生长过后,树上和地上的总花瓣数是多少。由于答案会很大,请你将答案mod 998244353后输出
示例1

输入

4

输出

12

说明

第一次:树上1,地上1.第二次树上2,地上1+1,第三次树上3,地上1+1+2,第四次树上5,地上1+1+2+3。总共12个
示例2

输入

5

输出

20

说明

第五次树上8,地上1+1+2+3+5。总共20个

备注:

对于0%的数据,有k=样例
对于20%的数据,有k<=1'000
对于60%的数据,有k<=1'000'000
对于80%的数据,有k<=1'000'000'000
对于100%的数据,有k<1'000'000'000'000'000'000

Solution:

  本题矩阵我写挂了,只得80分。

  我们观察样例,容易看出要求的是斐波那契前$k+1$项的和。

  打一张表,不难发现斐波那契前缀和有递推公式,设$g[i]$表示前$i$项的和,则$g[1]=2,g[2]=4$,$g[i]=g[i-1]+g[i-2]+1$。

  然后就能构造矩阵了:

    初始矩阵:$\begin{bmatrix}
 2& 4 & 7 & 1
\end{bmatrix}$

    转移矩阵:$\begin{bmatrix}
0 & 0 & 0 & 0\\
1 & 0 & 1 & 0\\
0 & 1 & 1 & 0\\
0 & 0 & 1 & 1
\end{bmatrix}$

代码:

/*Code by 520 -- 9.12*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
#define Clr(p) memset(&p,0,sizeof(p))
using namespace std;
const int mod=;
ll n;
struct matrix{ll a[][],r,c;}; il matrix Mul(matrix x,matrix y){
matrix tp;Clr(tp);
tp.r=x.r,tp.c=y.c;
For(i,,x.r-) For(j,,y.c-) For(k,,x.c-)
tp.a[i][j]=(tp.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
return tp;
} il ll Exp(ll k){
if(!k) return ;
if(k==) return ;
if(k==) return ;
k-=;
matrix tp,ans;Clr(tp),Clr(ans);
ans.r=,ans.c=tp.r=tp.c=;
ans.a[][]=,ans.a[][]=,ans.a[][]=,ans.a[][]=;
tp.a[][]=tp.a[][]=tp.a[][]=tp.a[][]=tp.a[][]=tp.a[][]=;
while(k){
if(k&) ans=Mul(ans,tp);
k>>=;
tp=Mul(tp,tp);
}
return ans.a[][];
} int main(){
cin>>n;
cout<<Exp(n);
return ;
}

E题:符合条件的整数

题目描述

众所周知,某个被共青团点名的学校的机房里有一个蒟蒻,名字叫做clccle,因为文化课成绩不好而经常被班主任gank,这次他遇到了一个很困(rui)难(zhi)的数学题,因为clccle非常辣鸡,所以他想到了聪明的你,你能帮Ta解决这个问题吗?
给定两个整数N,M,表示区间 [2N,2M),请求出在这个区间里有多少个整数i满足i % 7=1

输入描述:

一行,两个整数N,M 0<=N<M<=65

输出描述:

一个数字ans,表示满足条件的数字的个数
示例1

输入

2 3

输出

0

说明

在区间[22,23 )里满足条件的整数的个数为零  ,(4,5,6,7)8因为在开区间边界上所以不做考虑)

Solution:

  本题最水,送分到位。

  直接用$__int128$来存左右区间,然后求$[1,n]$中$\equiv 1\mod 7$的数$i$的个数,显然等于$\lceil \frac{n}{7} \rceil$,然后用$r-(l-1)$统计答案,稍微注意下区间的开闭就好了。

代码:

/*Code by 520 -- 9.12*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
int n,m;
__int128 a=,b=; int main(){
ll ans=;
cin>>n>>m;
if(!n) ans=;
For(i,,n-) a*=;
For(i,,m-) b*=;
a--,b--;
ans-=ceil((long double)a/),ans+=ceil((long double)b/);
cout<<ans;
return ;
}

F题:可爱即正义

题目描述

小可爱是个可爱的女孩子(nzdl)。
众所周知,小可爱在物竞初赛时候有两道大题没有做出来,所以,可爱的小可爱(qwq)便沉浸在了毒瘤之中——无法接受在任何地方看到"suqingnianloveskirito"这个东西。然而,这时候从SD某处送来了一封安慰信(情书),信的内容是一个26个小写拉丁字母组成的字符串s。这封信提前被wyxdrqc劫了下来(没错,就是这个劫),他打开了这封信,结果发现了满篇的"suqingnianloveskirito"所以他想篡改这封信。
由于他的能力有限,所以他只能把这个字符串的其中两个位置上的字符互换,而且只能操作一次。
他现在想问你,通过他的操作能不能使"suqingnianloveskirito"不是这个字符串的子串。

输入描述:

一行一个字符串s

输出描述:

如果他能通过只交换其中的两个位置上的字符使"suqingnianloveskirito"不是交换后的字符串的子串,则在第一行输出一个Yes,之后一行输出两个数d1,d2,表示你的方案是把原字符串在位置d1和位置d2上的字符互换,字符串的第一个字符的位置是1。
如果他不管交换那两个字符都不能满足条件,直接输出一行No。
示例1

输入

复制

suqingnianloveskiritosuqingnianloveskiritosuqingnianloveskiritothemostimportantthingneedsaidatleastthreetimes

输出

No
示例2

输入

suqingnianloveskiritosomuch

输出

Yes
1 2

备注:

对于100%数据,有字符串的长度<=1000000
对于10%数据,有测试数据的答案=样例。
并且你的方案中,不能出现d1=d2的情况。
如果有多种可行方案,输出任何一种即可得分

Solution:

  本题KMP板子。

  我们先求出模式串的next值,然后在主串中匹配,若模式串出现次数超过2次,就无解,否则就特判一下出现0、1、2次的输出情况就好了。

代码:

/*Code by 520 -- 9.12*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,m=,f[N],l1,r1,l2,r2;
char s[N],t[N]={'s','u','q','i','n','g','n','i','a','n','l','o','v','e','s','k','i','r','i','t','o'}; int main(){
scanf("%s",s),n=strlen(s);
int p=,tot=;
For(i,,m-){
while(p&&t[p]!=t[i]) p=f[p];
if(t[p]==t[i]) f[i+]=++p;
else f[i+]=;
}
p=;
For(i,,n-){
while(p&&s[i]!=t[p]) p=f[p];
if(s[i]==t[p]) p++;
if(p==m) {
tot++;
if(!l1) l1=i-m+,r1=i+;
else if(!l2) l2=i-m+,r2=i+;
else printf("No"),exit();
}
}
printf("Yes\n");
if(!l1) printf("1 2");
else if(!l2) printf("%d %d",l1,l1+);
else printf("%d %d",l1,l2+);
return ;
}
 
 

牛客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. 如何为一个高负荷站点配置tomcat连接器(connector)【译文】(第一篇)

    引言 最近正好要用到这些内容,因此就找了一篇比较有分量的文章,思来想去,还是尝试写一下译文吧.其实LZ的英语是非常烂的(四级没过的LZ眼泪掉下来),因此这篇文章翻译的水平LZ自己也不敢恭维.各位猿友大 ...

  2. wordpress4.4+版本自动生成一个768w像素缩略图的解决办法

    4.4版本以后,wordpress增加了响应式图片的功能,目的是让图片能适应手机.平板等不同屏幕,但是我不想要这个功能,把缩略图大小全调成0,function.php里的相关函数全删除了, 上传图片还 ...

  3. 矩阵分解-----LDL分解

    若一个矩阵A是正定的,那么该矩阵也可以唯一分解为\[{\bf{A = LD}}{{\bf{L}}^{\bf{T}}}\] 其中L是对角元素都为1的下三角矩阵,D是对角元素都为正数的对角矩阵.还是以三维 ...

  4. python数据分析的工具环境

    python做数据分析的优势: 拥有大量的库为数据分析和处理提供了完整的工具链 随着库还在不断的增加的同时, 算法的实现也更加的创新.Numpy, matplotlib, scipy,scikit-l ...

  5. flask中的宏

    对于flask中的宏编程.我们使用 macro 来对宏起个名称 宏编程 对于我们来说是减少了代码的重用.以及简化了标签的操作,对与开发效率有很大的提升, 在html中.相信大多数都用到了.input ...

  6. [C++]linux下实现rm()函数删除文件或目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html 在linux下有两个函数可以用来删除文件: #include <unistd.h ...

  7. Unity3d — — UGUI之Box Collider自适应大小

    NGUI下给Sprite/image添加collider后能自适应大小,但是在UGUI下Collider是默认在(0,0)位置,size为0 因此写了个简单的脚本,效果如下(最后附代码) 1.如下图添 ...

  8. 学习笔记 | treap | splay

    目录 前言 treap 它的基本操作 前言 不会数据结构选手深深地感受到了来自treap的恶意QwQ 在听的时候感觉自己听得听懂的??大概只是听懂了它的意思 代码是怎么写都感觉写不好╮(╯﹏╰)╭ 菜 ...

  9. nohup命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/hfismyangel/article/details/80258126 1.nohup 用途:不挂断地运行命令. 语法:n ...

  10. 网页调起App之应用实践

    声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 新春佳节即将到来,北京的上地&西二旗.望京&国贸.五道口&中关村地区等程序员 ...