Nowcoder | [题解-N165]牛客网NOIP赛前集训营-普及组(第二场)
啊...表示一大早还没睡醒就开始打比赛(开始前一分钟的我还在桌子上趴着休眠)...表示题目思路清奇(尤其C题)...但是我还是太蒻了...\(D\)题暴力都没打...题解正式开始之前先\(\%\)一下\(\color{#FF6161}{风浔凌}\)巨佬\(qwq\)...\(320\)真是太强了\(\%\%\%\)...
\(A\) 你好诶加币
题目描述:就是简单的\(a+b\)啊(逃)
题目本质:数据范围是\(long\ long\)的\(a+b\)啊(逃)
思路:显然不可能直接算啊...所以并不可解(逃)
详解:非常显然爆\(long\ long\)的情况只有在\(a,b\)同号时才会出现,所以考虑按照\(a,b\)的符号来分类
- \(a=0\ or\ b=0:\)此时\(a+b\)显然在\(long\ long\)范围内,直接输出\(a+b\)即可
- \(a>0\ and\ b>0:\)此时有可能会爆\(long\ long\),但是又不能直接求和判断(所以就说不可解啊(逃)),此时可以间接判断,\(\because a,b\in[1,INF]\) \(\therefore INF-b\in[0,INF-1]\) \(\because a+b>INF\Leftrightarrow a>INF-b\) \(\therefore\)在\(long\ long\)范围内可以判断\(a+b\)是否爆\(long\ long\),若不爆\(long\ long\)则输出\(a+b\),否则输出\("hello, \%lld\backslash n"\)
- \(a<0\ and\ b<0:\)同理,间接判断\(a+b\)是否爆\(long\ long\),若不爆\(long\ long\)则输出\(a+b\),否则输出\("hello, \%lld\backslash n"\)
- \((a>0\ and\ b<0)or(a<0\ and\ b>0):\)此时不会爆\(long\ long\),直接输出\(a+b\)即可
\(AC\)代码:
#include<cstdio>//N165A
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
const long long INFZ=9223372036854775807LL,INFF=-9223372036854775808LL;
long long a,b;
int main(){
scanf("%lld%lld",&a,&b);
if(a==0||b==0){
printf("%lld\n",a+b);
return 0;
}
if(a>0&&b>0){
if(INFZ-a<b){
printf("\"hello, %%lld\\n\"\n");
return 0;
}
printf("%lld\n",a+b);
return 0;
}
if(a<0&&b<0){
if(INFF-a>b){
printf("\"hello, %%lld\\n\"\n");
return 0;
}
printf("%lld\n",a+b);
return 0;
}
printf("%lld\n",a+b);
return 0;
}
\(B\) 最后一次
题目描述:求不超过\(n(n\in[2,10^{12}])\)的最大质数
题目本质:就是求不超过\(n\)的最大质数啊(逃)
思路:看到数据范围之后显然不能直接算啊...所以并不可解(逃)
详解:考虑到质数的分布密度,可以从\(n\)开始倒序查找,复杂度大概在\(O(logn\cdot \sqrt{n})\)...(口胡)
\(AC\)代码:
#include<cstdio>//N165B
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int N=1e6;
bool notpr[N+6];
int pr[80000],cntpr;
long long n;
void pre(){
notpr[0]=notpr[1]=true;
for(int i=2;i<=N;i++){
if(!notpr[i]){
pr[++cntpr]=i;
}
for(int j=1;j<=cntpr&&i*pr[j]<=N;j++){
notpr[i*pr[j]]=true;
if(i%pr[j]==0){
break;
}
}
}
}
bool isprime(long long x){
if(x<2){
return false;
}
if(x==2||x==3){
return true;
}
int lmt=(int)sqrt(x);
for(int i=1;i<=cntpr&&pr[i]<=lmt;i++){
if(x%pr[i]==0){
return false;
}
}
return true;
}
int main(){
pre();
scanf("%lld",&n);
if(n==2){
printf("2\n");
return 0;
}
if(n==3){
printf("3\n");
return 0;
}
if(isprime(n)){
printf("%lld\n",n);
return 0;
}
for(;n>2;--n){
if(isprime(n)){
printf("%lld\n",n);
return 0;
}
}
return 0;
}
\(C\) 选择颜色
题目描述:求一个长度为\(n(n\in[3,10^9])\)的有序环用\(c(c\in[3,100])\)种颜色染色,相邻颜色不相同的染色方式有多少种
题目本质:小学组合数学题(逃)
思路:如果是一条链不成环就非常容易...乘法原理就能解决...然而成环嘛...并不可解(逃)
详解:从简单的情况开始考虑,如果是一条链不成环那么结果显然是\(c\cdot (c-1)^{n-1}\),而成环之后的合法方式显然比不成环时少,少的部分是链染色方式中首尾颜色相同的部分,所以可以考虑用链方式数减链成环后不合法的方式数求出环合法染色方式数,此时问题就在于求链染色方式中首尾相同的方式数,此时问题可以转化为一个由\(n\)个点组成的无自环的无向完全图中长度为\(n-1\)的路径数,此时设\(f_{ij}\)表示从\(1\)出发到达\(j\)的长为\(i\)的路径条数,此时不难发现\(f_{i\ j}=\sum_{k=1}^{c}f_{i-1\ k}-f_{i-1\ j}\),据此可以考虑用矩阵快速幂完成线性递推求\(f_{n-1\ j}\),则有\(f_1\)矩阵$$\begin{vmatrix}f_{1\ 1}\f_{1\ 2}\f_{1\ 3}\\vdots\f_{1\ c}\end{vmatrix}=\begin{vmatrix}0\1\1\\vdots\1\end{vmatrix}$$基底矩阵为$$base=\begin{vmatrix}0&1&1&\cdots&1\1&0&1&\cdots&1\1&1&0&\cdots&1\\vdots&\vdots&\vdots&\ddots&\vdots\1&1&1&\cdots&0\end{vmatrix}$$则可求出从\(1\)出发到\(1\)路径长为\(n-1\)的路径条数\(f_{n-1\ 1}=f_{1\ 1}\times base^{n-2}\),同理可得不合法方式的总数为\(c\times f_{1\ 1}\times base^{n-2}\),故答案为\(c\times [(c-1)^{n-1}-f_{1\ 1}\times base^{n-2}]\),此时采用快速幂和矩阵加速求解即可
\(AC\)代码:
#include<cstdio>//N165C
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int MOD=10007;
const int C=100;
int n,c;
int ans;
int base[C][C],f[C],repcc[C][C],repc1[C];
void pre(){
f[0]=0;
for(int i=1;i<c;i++){
f[i]=1;
}
for(int i=0;i<c;i++){
for(int j=0;j<c;j++){
if(i==j){
base[i][j]=0;
}
else{
base[i][j]=1;
}
}
}
}
void mula(){
memset(repc1,0,sizeof repc1);
for(int i=0;i<c;i++){
for(int j=0;j<c;j++){
repc1[i]+=base[i][j]*f[j];
repc1[i]%=MOD;
}
}
for(int i=0;i<c;i++){
f[i]=repc1[i];
}
}
void mulb(){
memset(repcc,0,sizeof repcc);
for(int i=0;i<c;i++){
for(int j=0;j<c;j++){
for(int k=0;k<c;k++){
repcc[i][j]+=base[i][k]*base[k][j];
repcc[i][j]%=MOD;
}
}
}
for(int i=0;i<c;i++){
for(int j=0;j<c;j++){
base[i][j]=repcc[i][j];
}
}
}
void qpow(int u){
while(u){
if(u&1){
mula();
}
mulb();
u>>=1;
}
}
long long llqpow(int base,int u){
long long rep=1;
while(u){
if(u&1){
rep*=base;
rep%=MOD;
}
base*=base;
base%=MOD;
u>>=1;
}
return rep;
}
int main(){
scanf("%d%d",&n,&c);
pre();
ans=llqpow(c-1,n-1);
qpow(n-2);
ans-=f[0];
ans%=MOD;
ans+=MOD;
ans%=MOD;
ans*=c;
ans%=MOD;
printf("%d\n",ans);
return 0;
}
\(D\) 合法括号序列\(\color{#55ACEE}{表示这题还没过...暂且咕着qwq}\)
题目描述:
题目本质:
思路:
详解:
\(AC\)代码:
Nowcoder | [题解-N165]牛客网NOIP赛前集训营-普及组(第二场)的更多相关文章
- 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告
目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...
- [牛客网NOIP赛前集训营-普及组(第二场)]D-合法括号序列
链接:https://www.nowcoder.com/acm/contest/165/D来源:牛客网 合法括号序列 键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字 ...
- 牛客网NOIP赛前集训营-普及组(第七场)
链接:C 来源:牛客网 牛牛的同学给牛牛表演了一个读心术:牛牛先任意选定一个非负整数,然后进行N次操作:每次操作前,假设牛牛当前的数是a,那么这个操作可能是a = a + x, 或者a = a * x ...
- 牛客网NOIP赛前集训营-普及组(第一场)
前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ...
- 牛客网NOIP赛前集训营-普及组(第二场)
T1 牛牛刚学习了输入输出,他遇到了一道这样的题目. 输入2个整数a和b 保证输入的a和b在long long范围之内,即满足 -9223372036854775808 <= a, b < ...
- 牛客网NOIP赛前集训营-普及组(第一场)C 括号
括号 思路: dp 状态:dp[i][j]表示到i位置为止未匹配的 '(' 个数为j的方案数 状态转移: 如果s[i] == '(' dp[i][j] = dp[i-1][j] + dp[i-1][j ...
- 牛客网NOIP赛前集训营-普及组
第一场: A-绩点 题目描述 小A刚考完大学考试.现在已经出了n门课的成绩,他想自己先算一下这些课的绩点是多少.设第i门课的他拿到的绩点是gpai,而这门课的学分是sci,那么他的总绩点用下面的公式计 ...
- 牛客网 NOIP赛前集训营-普及组(第四场)C--部分和 (高维前缀和)
传送门 解题思路 高维前缀和模板题.首先,求前缀和有两种方式,比如说对于求二维前缀和来说. 第一种 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++ ...
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
随机推荐
- NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plus
NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plushttps://docs. ...
- Windows 10正式版历代记:Version 和 Build 对应关系
2017年10月中下旬,微软面向正式版用户推送了Windows 10创意者更新秋季版.这是自发布以来,Windows 10的第五个大版本. 在这篇文章中,我们来回顾一下Windows 10正式版的历史 ...
- Oracle 内存参数调优设置
Oracle 数据库系统中起到调节作用的参数叫初始化参数,数据库管理员根据实际情况需要适当调整这些 初始化参数以优化Oracle系统. 1 主要系统参数调优介绍 2 系统内存参数的分配 2.1 Ora ...
- Oracle pivot行转列函数案例
with temp as( select '湖北省' province,'武汉市' city,'第一' ranking from dual union all select '湖北省' provinc ...
- jQuery EasyUI 折叠面板accordion的使用实例
1.对折叠面板区域 div 设置 class=”easyui-accordion” 2.在区域添加多个 div, 每个 div 就是一个面板 (每个面板一定要设置 title 属性). 3.设置面板属 ...
- 数组中元素累加 reduce
例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- 工作效率提升之Eclipse篇(1):干掉烦人的xml文件的validation
每次启动maven项目,都会有一堆烦人的xml文件的validation,一旦网络较慢,项目重新启动的时候,这些多余的验证纯属浪费时间. Eclipse上取消validation的方法: 1.菜单[W ...
- Ionic常用命令
安装ionic npm install -g ionic 更新www/lib/ionic 目录的文件,如有项目中有bower,此命令会运行bower update ionic, 否则则会从CDN上下载 ...
- CentOS7学习
1.为什么学linux? linux开源免费,系统稳定,多用户的操作系统. linux有许多版本,各个版本之间的不同点大概分三种? > 内核不同 > 集成不同的应用 > 定制不同的图 ...
- Linux的基础命令, django的安装与使用
一. Linux一些基础指令 cat命令, 用于查看纯文本文件(常用于内容较少的) cat 校花的故事.txt # 查看文件 cat -n 校花的故事.txt # 查看文件并显示行号 -n 显示行号 ...