老妈送来了防寒补给就很棒,再也不用晚上盖两层毛巾被了,再也不用担心晚上自动把毛巾被$split$了

还有一些好吃的耶叶

T1 小L的疑惑

考场上疑惑的切掉了

直接把$a$排序然后处理前缀和的过程中判断和下一个的数的差就行

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(int x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14 const int NN=1e5+5;
15 int n,a[NN];
16 namespace WSN{
17 inline short main(){
18 freopen("math.in","r",stdin);
19 freopen("math.out","w",stdout);
20 n=read();
21 for(int i=1;i<=n;i++) a[i]=read();
22 sort(a+1,a+n+1);int sum=0;
23 for(int i=1;i<=n;i++){
24 if(a[i]-sum>1){
25 printf("%lld\n",sum+1);
26 return 0;
27 }
28 sum+=a[i];
29 }
30 printf("%lld\n",sum+1);
31 return 0;
32 }
33 }
34 signed main(){return WSN::main();}

T2 小L的数列

一眼矩阵快速幂,然后就开始刚他

发现计算的时候是连乘,非常不爽那么考虑对指数快速幂

找到每一个$f_1...f_k$的对应指数然后就可以计算了

转移矩阵是一个类似这样的,拿$k=4$举例

$\begin{vmatrix}b_1 &b_2  &b_3  &b_4 \\ 1 &0 &0  &0 \\ 0 &1  &0  &0 \\ 0 &0  &1  &0 \end{vmatrix}$

然后你就会陷入无尽的痛苦中,为啥它小点对,大点不对啊

你开始怀疑自己,甚至否认了转移矩阵,然后突然发现了一件事情:对指数矩阵快速幂

$\huge{?}$

$\huge{!}$

$a^b\equiv a^{ b\mod \phi (p)}(\mod p)$

然后就被卡常了。。。。。。

然后就$\textit{%:pragma GCC optimize(2)}$了。。。。。。

 1 %: pragma GCC optimize(2)
2 #include<bits/stdc++.h>
3 #define int long long
4 using namespace std;
5 namespace AE86{
6 inline int read(){
7 int x=0,f=1;char ch=getchar();
8 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
9 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
10 }inline void write(int x,char opt='\n'){
11 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
12 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
13 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
14 }using namespace AE86;
15 const int KK=205,mod=998244353;
16 int n,k,b[KK],f[KK];
17 inline int qmo(int a,int b,int ans=1){
18 int c=mod; a%=c;
19 while(b){
20 if(b&1) ans=ans*a%c;
21 b>>=1; a=a*a%c;
22 }
23 return ans;
24 }
25 namespace Matrix{
26 struct Ma{
27 int m[KK][KK];
28 Ma(){memset(m,0,sizeof(m));}
29 inline void pre(){for(int i=1;i<=k;i++)m[i][i]=1;}
30 };
31 inline Ma muls(Ma a,Ma b){
32 Ma c;
33 for(int i=1;i<=k;i++)
34 for(int j=1;j<=k;j++)
35 for(int u=1;u<=k;u++)
36 c.m[i][j]=(c.m[i][j]+a.m[i][u]*b.m[u][j]%(mod-1))%(mod-1);
37 return c;
38 }
39 }using namespace Matrix;
40 int dp[KK],c[KK];
41 inline void mul(int a[KK],Ma b){
42 memset(c,0,sizeof(c));
43 for(int i=1;i<=k;i++)
44 for(int j=1;j<=k;j++)
45 c[i]=(c[i]+a[j]*b.m[j][i]%(mod-1))%(mod-1);
46 memcpy(a,c,sizeof(c));
47 }
48 namespace WSN{
49 inline short main(){
50 freopen("seq.in","r",stdin);
51 freopen("seq.out","w",stdout);
52 n=read(); k=read();
53 for(int i=1;i<=k;i++) dp[i]=b[i]=read();
54 for(int i=1;i<=k;i++) f[i]=read();
55 Ma g;
56 for(int i=1;i<=k;i++){
57 g.m[1][i]=b[i];
58 if(i+1<=k) g.m[i+1][i]=1;
59 }
60 int b=n-k-1;
61 if(n<=k){ write(f[n]);return 0;}
62 while(b){
63 if(b&1) mul(dp,g);
64 b>>=1; g=muls(g,g);
65 }
66 int tmp=1;
67 for(int i=1;i<=k;i++){
68 tmp=tmp*qmo(f[k-i+1],dp[i])%mod;
69 } write(tmp);
70 return 0;
71 }
72 }
73 signed main(){return WSN::main();}

T3 连边

多源$dijkstra$处理出每个黑点为原点的到每个白点的最短路,然后考虑把重复的部分删掉就行了

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(int x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14 const int NN=1e5+5,MM=2e5+5,inf=1e18;
15 int n,m,seg[NN];
16 struct SNOW{int to,val,next;}e[MM<<1];int head[NN],rp;
17 inline void add(int x,int y,int z){
18 e[++rp]=(SNOW){y,z,head[x]};head[x]=rp;
19 e[++rp]=(SNOW){x,z,head[y]};head[y]=rp;
20 }
21 struct node{
22 int id,data;
23 friend bool operator<(node a,node b){
24 return a.data>b.data;
25 }
26 };priority_queue<node> Q;
27 int dis[NN];bool vis[NN];
28 inline void dij(){
29 for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
30 for(int i=1;i<=n;i++) if(seg[i])
31 Q.push(node{i,0}),dis[i]=0;
32 while(!Q.empty()){
33 int x=Q.top().id,y=Q.top().data;Q.pop();
34 if(!vis[x]){ vis[x]=1;
35 for(int i=head[x];i;i=e[i].next)
36 if(dis[e[i].to]>dis[x]+e[i].val)
37 Q.push(node{e[i].to,dis[e[i].to]=dis[x]+e[i].val});
38 }
39 }
40 }
41 int ans,sheng[NN];
42 namespace WSN{
43 inline short main(){
44 freopen("minimum.in","r",stdin);
45 freopen("minimum.out","w",stdout);
46 n=read(); m=read();
47 for(int i=1;i<=n;i++) seg[i]=read();
48 for(int i=1,x,y,z;i<=m;i++)
49 x=read(),y=read(),z=read(),add(x,y,z);
50 dij();
51 for(int i=1;i<=n;i++) if((!seg[i])&&dis[i]>=inf) return puts("impossible"),0;
52 for(int i=1;i<=n;i++){
53 if(seg[i]) continue;
54 for(int j=head[i];j;j=e[j].next){
55 int y=e[j].to,val=e[j].val; if(seg[y]) continue;
56 if(dis[y]==dis[i]+val) sheng[y]=max(sheng[y],dis[i]);
57 }
58 }
59 for(int i=1;i<=n;i++) ans+=dis[i]-sheng[i];
60 write(ans);
61 return 0;
62 }
63 }
64 signed main(){return WSN::main();}

T4 小L的有向图

对于一种拓扑序$p$,可以求出原图有几条边可以被这个拓扑序满足,假设有$k$条,对答案的贡献就是$2^k$

用状压$dp$计算,每次新加入一个点有几条和这个点有关的边被满足了

时间复杂度$O(2^n n)$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(int x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14 const int NN=23,mod=998244353;
15 int n,m,U,dp[1<<NN],pw[500],g[1<<NN];
16 namespace WSN{
17 inline short main(){
18 freopen("topology.in","r",stdin);
19 freopen("topology.out","w",stdout);
20 n=read();m=read(); U=(1<<n)-1; pw[0]=dp[0]=1;
21 for(int i=1,x,y;i<=m;i++)
22 x=read(),y=read(),g[y]|=(1<<x-1),pw[i]=(pw[i-1]<<1)%mod;
23 for(int s=0;s<=U;s++){
24 for(int i=1;i<=n;i++) if(!(s&(1<<i-1))){
25 int k=__builtin_popcount(s&g[i]);
26 (dp[s|(1<<i-1)]+=dp[s]*pw[k]%mod)%=mod;
27 }
28 }
29 write(dp[U]);
30 return 0;
31 }
32 }
33 signed main(){return WSN::main();}

由于最后的两道题过于不符合$T3,T4$水平,于是乎。。。。

$UPD 20:35$

收到远方朋友的消息该更新了

于是乎。。。。

这里补充一下更新原因是因为原来加的两道题过于不可做,于是加了两道比较可做的

T7 中国象棋

题意转化:有几种方案构建$01$矩阵,使其每行每列的$1$的个数不超过$2$

考虑$dp[i][j][k]$表示考虑到第$i$行有$j$列放了$1$个棋子,$k$列放了$0$个棋子

然后分超多情况转移即可,直接放码了,因为写出来和码出来没啥大区别

记得先继承上一行的方案数。

初始状态:$dp[0][0][m]=1$

目标状态$\sum \limits_{i=0}^{m} \sum \limits_{j=0}^{m} dp[n][i][j]$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(int x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14 const int NN=105,mod=9999973,v2=4999987;
15 int n,m,f[NN][NN][NN];
16 namespace WSN{
17 inline short main(){
18 freopen("chess.in","r",stdin);
19 freopen("chess.out","w",stdout);
20 n=read();m=read(); f[0][0][m]=1;
21 for(int i=1;i<=n;i++){
22 for(int j=0;j<=m;j++){
23 for(int k=0;k<=m;k++){
24 f[i][j][k]=f[i-1][j][k];
25 if(j-1>=0&&k+1<=m) (f[i][j][k]+=f[i-1][j-1][k+1]*(k+1)%mod)%=mod;
26 if(j+1<=m) (f[i][j][k]+=f[i-1][j+1][k]*(j+1)%mod)%=mod;
27 if(k+1<=m) (f[i][j][k]+=f[i-1][j][k+1]*j%mod*(k+1)%mod)%=mod;
28 if(j-2>=0&&k+2<=m) (f[i][j][k]+=f[i-1][j-2][k+2]*(k+2)%mod*(k+1)%mod*v2%mod)%=mod;
29 if(j+2<=m) (f[i][j][k]+=f[i-1][j+2][k]*(j+2)%mod*(j+1)%mod*v2%mod)%=mod;
30 }
31 }
32 } int ans=0;
33 for(int i=0;i<=m;i++){
34 for(int j=0;i+j<=m;j++){
35 (ans+=f[n][i][j])%=mod;
36 }
37 }
38 write(ans);
39 return 0;
40 }
41 }
42 signed main(){return WSN::main();}

T8 奇妙的Fibonacci

关于一个推论的证明,我们可以去看别人的博客,因为这个推论的前置知识比较多,写在这里太多了,就不展开了

直接说结论,就是$n|m \Leftrightarrow fib_n|fib_m$,

然后最恶心的就是要特判第二项!!!

然而凭借打表发现这个规律的我并未关注到这一点,一直以为结论是假的,导致拖了很久才切掉这道题,最后还是问小熠这结论怎么回事

然后知道这个结论后发现就是一个裸的线性筛约数个数约数平方和

然后我是结合打的表推出来的约数平方和,和约数和非常类似

数组定义如下:

$d[i]$表示约数个数

$e[i]$表示$i$中最小质因子出现的次数

$pw[i]$表示约数平方和

$f[i]$表示$i$把所有的最小质因子除干净后剩的数

然后转移的话就不写了,表达出来跟代码一样,不如直接看码

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 namespace AE86{
5 inline int read(){
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
9 }inline void write(int x,char opt='\n'){
10 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
11 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
12 for(register int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14 const int NN=1e7+1,mod=1e9+7;
15 int d[NN],prime[NN],cnt,e[NN],pw[NN],f[NN];
16 bool vis[NN];
17 inline void getprime(){
18 pw[1]=d[1]=1;
19 for(int i=2;i<NN;i++){
20 if(!vis[i]) prime[++cnt]=i,d[i]=2,pw[i]=1+i*i,f[i]=e[i]=1;
21 for(int j=1;j<=cnt && i*prime[j]<NN;j++){
22 vis[i*prime[j]]=1;
23 if(i%prime[j]==0){
24 d[i*prime[j]]=d[i]/(e[i]+1)*(e[i]+2);
25 pw[i*prime[j]]=pw[i]+pw[f[i]]*(i*prime[j]/f[i])*(i*prime[j]/f[i]);
26 e[i*prime[j]]=e[i]+1;
27 f[i*prime[j]]=f[i];
28 break;
29 }
30 d[i*prime[j]]=d[i]*2;
31 pw[i*prime[j]]=pw[i]*pw[prime[j]];
32 e[i*prime[j]]=1;
33 f[i*prime[j]]=i;
34 }
35 }
36 }
37 int q,a,b,c,n;
38 namespace WSN{
39 inline short main(){
40 getprime();
41 // for(int i=1;i<=20;i++) cout<<i<<" "<<d[i]<<" "<<pw[i]<<endl;
42 // for(int i=1;i<=20;i++) cout<<i<<" "<<d[i]+(i&1)<<" "<<pw[i]+((i&1)?d[i]+2:0)<<endl;
43 n=read(); q=read(); a=read(); b=read(); c=read();
44 int ans1=d[q]+(q&1),ans2=pw[q]+((q&1)?4:0);
45 // printf("i=%lld ans1=%lld ans2=%lld\n",q,ans1,ans2);
46 for(int i=2;i<=n;i++){
47 q=(q*a+b)%c+1;
48 (ans1+=d[q]+(q&1))%=mod;
49 (ans2+=pw[q]+((q&1)?4:0))%=mod;
50 // printf("i=%lld ans1=%lld ans2=%lld\n",q,d[q]+(q&1),pw[q]+(q&1));
51 } write(ans1);write(ans2);
52 return 0;
53 }
54 }
55 signed main(){return WSN::main();}

再次提醒,记得特判第二项!!!

Noip模拟73 2021.10.10的更多相关文章

  1. Noip模拟35 2021.8.10

    考试题目变成四道了,貌似确实根本改不完... 不过给了两个小时颓废时间确实很爽(芜湖--) 但是前几天三道题改着不是很费劲的时候为什么不给放松时间, 非要在改不完题的时候颓?? 算了算了不碎碎念了.. ...

  2. Noip模拟6 2021.6.10

    T1 辣鸡 首先吐嘈一下,这题的测试点就离谱,不说了,附上我65分代码: 1 #include<bits/stdc++.h> 2 #define int long long 3 using ...

  3. Noip模拟50 2021.9.10

    已经好长时间没有考试不挂分的良好体验了... T1 第零题 开场数据结构,真爽 对于这道题首先要理解对于一条链从上向下和从下向上走复活次数相等 (这可能需要晚上躺在被窝里面脑摸几种情况的样例) 然后就 ...

  4. Noip模拟80 2021.10.18

    预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...

  5. 2021.10.10考试总结[NOIP模拟73]

    T1 小L的疑惑 对于\(P_i\),如果所有比\(P_i\)小的数加起来也达不到\(P_i-1\),那么值域肯定不连续.否则设原来值域最大值为\(mx\),则\(P_i\)会让值域最大值增致\(mx ...

  6. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  7. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  8. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  9. Noip模拟81 2021.10.20

    T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...

随机推荐

  1. C# HttpWebResponse 请求常见的状态码

    Accepted 202 等效于 HTTP 状态 202. Accepted 指示已接受请求做进一步处理. AlreadyReported 208 等效于 HTTP 状态 208. AlreadyRe ...

  2. JDBC使用案例

    一.结果集中获取数据并对实体set值,封装成对象返回: 2.封装JDBC工具类 只要执行一次的,如读取配置文件,则写静态代码块: 异常抛出要写明方法才可以throw,静态代码块异常只能捕捉try ca ...

  3. MySQL实战45讲(01--05)-笔记

    目录 MySQL复习 01 | 基础架构:一条SQL查询语句是如何执行的? 连接器 查询缓存 分析器 优化器 执行器 02 | 日志系统:一条SQL更新语句是如何执行的? 重要的日志模块:redo l ...

  4. Centos 6.8 系统下安装RabbitMQ方法

    一,安装 RabbitMQ 首先要先安装 erlang 1,到erlang官网下载 OTP 19.0 Source File 2,解压 tar zvxf otp_src_19.0.tar.gz 3,c ...

  5. python中reduce filter map lambda函数

    lambda函数 python 使用 lambda 来创建匿名函数,lambda返回值是一个函数的地址,也就是函数对象. 语法:lambda [arg1 [,arg2,.....argn]]:expr ...

  6. 内部类访问外部类成员变量,使用外部类名.this.成员变量

    public class Outer { private int age = 12; class Inner { private int age = 13; public void print() { ...

  7. HDU1548 Building Roads

    A strange lift Description There is a strange lift.The lift can stop can at every floor as you want, ...

  8. centos7 未启用swap导致内存使用率过高。

    情况描述: 朋友在阿里云上有一台系统为CentOS7的VPS,内存为2GB,用于平时开发自己的项目时测试使用: 他在上面运行了5个docker实例,运行java程序:还有一个mysql服务: 上述5个 ...

  9. Thinkphp5 主动式 计划任务 支持windows和linux

    百度搜索过相关的php计划任务的资料,特别是搜索thinkphp的计划任务,目前能明确实现的都是被动式的,就是通过tp3.2自带的计划任务类实现,通过挂钩子的形式,用户访问网站的时候就执行计划任务,这 ...

  10. python的列表和java的数组有何异同

    今天面试被问到,自己学习一下. python的列表是可变长的,定义时不需要指定长度:pyhton是弱对象类型,python的列表存储的数据类型可以不相同:python的列表更加灵活,如可以通过''命令 ...