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})\)的非负整数次幂的数的个 ...
随机推荐
- JavaWeb连接SQLServer数据库并完成一个登录界面及其功能设计。
一.JDBC连接SQLserver数据库的步骤: 1.下载SQLserver的JDBC驱动文件——Microsoft JDBC Driver 4.0 for SQL Server 2.例如下载得到的文 ...
- 多线程系列之七:Read-Write Lock模式
一,Read-Write Lock模式 在Read-Write Lock模式中,读取操作和写入操作是分开考虑的.在执行读取操作之前,线程必须获取用于读取的锁.在执行写入操作之前,线程必须获取用于写入的 ...
- nginx 编译安装以及简单配置
前言 Nginx的大名如雷贯耳,资料太多了,网上一搜一大把,所以这里就不阐述nginx的工作原理了,只是简单的编译安装nginx,然后呢,简单配置一下下. 下载Nginx.安装 下载地址:http:/ ...
- alibaba druid
FAQ · alibaba/druid Wikihttps://github.com/alibaba/druid/wiki/FAQ sql 连接数不释放 ,Druid异常:wait millis 40 ...
- 简述nginx(1)
Nginx能做什么 1.反向代理 2.负载均衡 3.HTTP服务器(包含动静分离) 4.正向代理 反向代理 反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理 ...
- css引入的两种方法link和@import的区别和用法
link和@import都是HTML中引入CSS的语法单词. 两者的基本语法 link语法结构 <link href="外部CSS文件的URL路径" rel="st ...
- Chrome 离线安装插件的办法
参考url 学习网址 https://blog.csdn.net/weixin_39068791/article/details/81411938 插件下载地址: http://www.lanfans ...
- select非group by字段的方法
只需要将非group by字段放进函数中即可:
- 为什么js中要用void 0 代替undefined
这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...
- python学习笔记(8)--random库的使用
伪随机数:采用梅森旋转算法生成的伪随机序列中元素 使用random库 一.基本随机函数 随机数需要一个种子,依据这个种子通过梅森旋转算法产生固定序列的随机数.seed(a=None) 初始化给定的随 ...