2021.8.24考试总结[NOIP47]
T1 prime
发现只需筛小于等于$mid(\sqrt r,k)$的质数,之后用这些质数筛掉区间内不合法的数即可。
$code:$
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4
5 namespace IO{
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(); }
10 return x*f;
11 }
12 inline void write(int x,char sp){
13 char ch[20]; int len=0;
14 if(x<0){ putchar('-'); x=~x+1; }
15 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
16 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
17 }
18 } using namespace IO;
19
20 const int NN=1e7+5;
21 int l,r,k,cnt,ans,pri[NN],ext;
22 bool vis[NN],is[NN];
23
24 void prime(){
25 for(int i=2;i<=ext;i++){
26 if(i<=k&&!vis[i]) pri[++cnt]=i;
27 for(int j=1;j<=cnt&&i*pri[j]<=ext;j++){
28 vis[i*pri[j]]=1;
29 if(!i%pri[j]) break;
30 }
31 }
32 for(int i=1;i<=cnt;i++){
33 int j=l/pri[i];
34 if(l!=pri[i]*j) ++j;
35 for(j=max(j,2ll);j*pri[i]<=r;j++)
36 is[j*pri[i]-l]=1;
37 }
38 }
39
40 signed main(){
41 l=read(); r=read(); k=read(); ext=min((int)sqrt(r),k);
42 prime();
43 for(int i=l;i<=r;i++)
44 if(!is[i-l]) ans^=i;
45 write(ans,'\n');
46 return 0;
47 }
T1
T2 sequence
先考虑基础$DP$。
设$f_{i}$表示以$i$为结尾的不同子序列个数。那么每次转移都有$f_i=1+\sum_{j=1}^k f_j$。最终答案为$\sum_{i=1}^k f_i$。
发现转移后大小的固定的,那么为了最大化答案,每次找最小的状态转移。
然后看到$m$的范围,有发现每次$DP$存在规律,考虑矩阵优化。
可以先通过每个值最后出现的位置得到$DP$值取模前的真实大小关系,从大到小排序,构成状态矩阵。
考虑转移矩阵,每次挑最小的转移变为最大的,然后次小变为最小,以此类推。以$k=4$为例:
$\begin{Bmatrix}
f_1\\
f_2\\
f_3\\
f_4\\
1
\end{Bmatrix}\times\begin{Bmatrix}
0 &1 &0 &0 &0 \\
0 &0 &1 &0 &0 \\0 & 0 & 0 & 1 &0 \\
1 &1 &1 &1 &1 \\
0 & 0 & 0 &0 &1
\end{Bmatrix}$
$code:$
1 #include<bits/stdc++.h>
2 #define rin register signed
3 using namespace std;
4 typedef long long LL;
5
6 namespace IO{
7 inline LL read(){
8 LL x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13 inline void write(int x,char sp){
14 char ch[20]; int len=0;
15 if(x<0){ putchar('-'); x=~x+1; }
16 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
17 for(rin i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
18 }
19 } using namespace IO;
20
21 const int NN=1e6+5,p=1000000007;
22 int n,k,a[NN],b[105],lst[105],g[105],cnt,sum,ans;
23 LL m;
24 bool vis[105];
25 struct node{
26 int val,lst;
27 node(){} node(int a,int b){val=a,lst=b;}
28 inline bool operator <(const node &x)const{ return lst>x.lst; }
29 };
30 priority_queue<node> q;
31
32 namespace matrix{
33 struct mat{
34 int s[105][105];
35 void clear(){ memset(s,0,sizeof(s)); }
36 void pre(){ clear(); for(rin i=1;i<=k+1;i++) s[i][i]=1; }
37 }base,f;
38 mat mul(mat x,mat y){
39 mat res; res.clear();
40 for(rin i=1;i<=k+1;i++)
41 for(rin j=1;j<=k+1;j++)
42 for(rin u=1;u<=k+1;u++)
43 (res.s[i][j]+=1ll*x.s[i][u]*y.s[u][j]%p)%=p;
44 return res;
45 }
46 void qpow(int b){
47 }
48 } using namespace matrix;
49
50 void init(){
51 int cnt=0;
52 f.s[k+1][1]=base.s[k+1][k+1]=1;
53 for(rin i=2;i<=k;i++) base.s[i-1][i]=1;
54 for(rin i=1;i<=k+1;i++) base.s[k][i]=1;
55 while(!q.empty()){ f.s[++cnt][1]=q.top().val; q.pop(); }
56 }
57
58 signed main(){
59 n=read(); m=read(); k=read();
60 for(rin i=1;i<=n;i++) a[i]=read();
61 for(rin i=1;i<=n;i++){
62 sum=(p+sum-g[a[i]])%p;
63 g[a[i]]=(g[a[i]]+sum+1)%p;
64 sum=(sum+g[a[i]])%p;
65 lst[a[i]]=i;
66 }
67 for(int i=1;i<=k;i++) q.push(node(g[i],lst[i]));
68 init();
69 while(m){
70 if(m&1) f=mul(base,f);
71 base=mul(base,base);
72 m>>=1;
73 }
74 for(rin i=1;i<=k;i++) (ans+=f.s[i][1])%=p;
75 write(ans,'\n');
76 return 0;
77 }
T2
T3 omeed
暴力$75$,正解神仙数据结构,线段树上维护基础分的和与左端点$-1$处连击分推出右端点连击分与$\sum_{i=l}^r p_i(combo_{i-1}+1)$的系数。
太神仙了不知道如何讲。丢个代码爬了
$code:$
1 #include<bits/stdc++.h>
2 using namespace std;
3
4 namespace IO{
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(); }
9 return x*f;
10 }
11 inline void write(int x,char sp){
12 char ch[20]; int len=0;
13 if(x<0){ putchar('-'); x=~x+1; }
14 do{ ch[len++]=x%10+(1<<5)+(1<<4); x/=10; }while(x);
15 for(int i=len-1;~i;i--) putchar(ch[i]); putchar(sp);
16 }
17 } using namespace IO;
18
19 const int NN=5e5+5,mod=998244353;
20 int id,n,q,t,A,B,p[NN],combo,combos,basics,opt;
21 struct node{ int k,b,sum,ans,xi; };
22
23 inline int inv(int x){
24 int b=mod-2,res=1;
25 while(b){
26 if(b&1) res=1ll*res*x%mod;
27 x=1ll*x*x%mod;
28 b>>=1;
29 }
30 return res;
31 }
32
33 namespace segment_tree{
34 #define ld rt<<1
35 #define rd (rt<<1)|1
36 int k[NN<<2],b[NN<<2],sum[NN<<2],ans[NN<<2],xi[NN<<2],l[NN<<2],r[NN<<2];
37 inline void pushup(int rt){
38 sum[rt]=(1ll*sum[ld]+sum[rd])%mod;
39 k[rt]=1ll*k[ld]*k[rd]%mod;
40 b[rt]=(1ll*b[ld]*k[rd]%mod+b[rd])%mod;
41 xi[rt]=(1ll*xi[rd]*k[ld]%mod+xi[ld])%mod;
42 ans[rt]=(1ll*b[ld]*xi[rd]%mod+ans[ld]+ans[rd])%mod;
43 }
44 void build(int rt,int opl,int opr){
45 l[rt]=opl; r[rt]=opr;
46 if(opl==opr){
47 k[rt]=(p[opl]+t-1ll*p[opl]*t%mod+mod)%mod;
48 b[rt]=p[opl];
49 xi[rt]=ans[rt]=sum[rt]=p[opl];
50 return;
51 }
52 int mid=opl+opr>>1;
53 build(ld,opl,mid); build(rd,mid+1,opr);
54 pushup(rt);
55 }
56 void update(int rt,int pos){
57 if(l[rt]==r[rt]){
58 k[rt]=(p[pos]+t-1ll*p[pos]*t%mod+mod)%mod;
59 b[rt]=p[pos];
60 xi[rt]=ans[rt]=sum[rt]=p[pos];
61 return;
62 }
63 int mid=l[rt]+r[rt]>>1;
64 if(pos<=mid) update(ld,pos);
65 else update(rd,pos);
66 pushup(rt);
67 }
68 node query(int rt,int opl,int opr){
69 if(l[rt]>=opl&&r[rt]<=opr) return (node){k[rt],b[rt],sum[rt],ans[rt],xi[rt]};
70 int mid=l[rt]+r[rt]>>1;
71 node tmp1={0,0,0,0,0},tmp2={0,0,0,0,0},res;
72 if(opl<=mid) tmp1=query(ld,opl,opr);
73 if(opr>mid) tmp2=query(rd,opl,opr);
74 res.k=1ll*tmp1.k*tmp2.k%mod;
75 res.b=(1ll*tmp1.b*tmp2.k%mod+tmp2.b)%mod;
76 res.sum=(tmp1.sum+tmp2.sum)%mod;
77 res.ans=(1ll*tmp1.b*tmp2.xi%mod+tmp1.ans+tmp2.ans)%mod;
78 res.xi=(tmp1.xi+1ll*tmp2.xi*tmp1.k%mod)%mod;
79 return res;
80 }
81 } using namespace segment_tree;
82
83 signed main(){
84 id=read();
85 n=read(); q=read(); t=read(); t=1ll*t*inv(read())%mod; A=read()%mod; B=read()%mod;
86 for(int i=1;i<=n;i++) p[i]=read(), p[i]=1ll*p[i]*inv(read())%mod;
87 build(1,1,n);
88 while(q--){
89 opt=read();
90 if(opt==0){
91 int x=read(),w=read(); w=1ll*w*inv(read())%mod;
92 p[x]=w; update(1,x);
93 } else{
94 int ll=read(),rr=read();
95 node tmp=query(1,ll,rr);
96 write((1ll*A*tmp.sum%mod+1ll*B*tmp.ans%mod)%mod,'\n');
97 }
98 }
99 return 0;
100 }
T3
2021.8.24考试总结[NOIP47]的更多相关文章
- 2021.5.24考试总结 [NOIP模拟3]
带着爆0的心态考的试,没想到整了个假rk2 (炸鱼大佬wtz忒强了OTZ T1 景区路线规划 这题对刚学完概率期望的我来说简直水爆了好吗.. 因为存在时间限制,不好跑高斯消元,就直接跑dp就完了. 令 ...
- 2021.04.24【NOIP提高B组】模拟 总结
2021.04.24[NOIP提高B组]模拟 总结 T1 题意:有一圈数.两两之间有加法或乘法操作, 问你开始断掉那条边使得剩下的序列经过某种操作后的值最大 看上去是个区间 dp .然后直接断环成列, ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 梦开始的地方(Noip模拟3) 2021.5.24
T1 景区路线规划(期望dp/记忆化搜索) 一看题目发现肯定是概率期望题,再仔细想想这三天做的题,就知道是个期望dp. 考试思路(错): 因为聪聪与可可的10分打法根深蒂固,导致在考试时想到了用深搜( ...
- 题解 2020.10.24 考试 T2 选数
题目传送门 题目大意 见题面. 思路 本来以为zcx.pxj变强了,后来发现是SPJ出问题了...考试的时候感觉有点人均啊...结果自己还是只想出来一半. 我们假设 \(f(x)=(\lfloor\f ...
- 2021.10.18考试总结[NOIP模拟76]
T1 洛希极限 不难发现每个点肯定是被它上一行或上一列的点转移.可以预处理出每个点上一行,上一列最远的能转移到它的点,然后单调队列优化. 预处理稍显ex.可以用并查集维护一个链表,记录当前点之后第一个 ...
- 2021.10.7考试总结[NOIP模拟71]
信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
随机推荐
- aes加解密后续问题contentType不是application/json时候后台解析请求对象request
一.post请求的三种content-type 1.application/x-www-form-urlencoded 主要用于如下:1.1: 最常见的POST提交数据方式.1.2:原生form默认的 ...
- clickonce的密钥到期问题处理
最近clickonce的密钥到期了,在网上找了些文章用来修改密钥的到期时间,已成功生成新密钥,好不好使暂时未测. 在此小结一下,以备参考: 1.在原密钥所属电脑上cmd执行如下命令 renewcert ...
- Elasticsearch(ES)的高级搜索(DSL搜索)(上篇)
1. 概述 之前聊了一下 Elasticsearch(ES)的基本使用,今天我们聊聊 Elasticsearch(ES)的高级搜索(DSL搜索),由于DSL搜索内容比较多,因此分为两篇文章完成. 2. ...
- umi request 请求资源库详解
umi-request: 网络请求库,基于fetch封装,兼具fetch 和 axios 的所有特点,具有缓存,超时,字符编码处理,错误处理等常用功能. 1 支持url 参数自动序列化. 2 post ...
- requests接口自动化-动态关联text/html格式
动态关联,前一个接口返回的值为后一个接口请求的参数. # 动态关联 import requests def test_cookies(): # 以百度为例 r_baidu=requests.get(' ...
- Spring Cloud Gateway 没有链路信息,我 TM 人傻了(下)
本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...
- CSS 奇技淫巧 | 妙用混合模式实现文字镂空波浪效果
本文将介绍一个小技巧,通过混合模式 mix-blend-mode 巧妙的实现文字的镂空波浪效果. 起因 一日,一群友私聊问我.如何使用 CSS 实现下述效果,一个文字的波浪效果: 我当时想都没想,就回 ...
- serialVersionUID序列化版本号与ObjectOutputStream对象输入输出流
1. 观察ObjectOutputStream 我们观察ObjectOutputStream就可以发现该类没有无参构造,只有有参构造,所以他是一个包装流 2. 具体使用: public static ...
- 升级sudo版本
1.查看sudo版本 sudo -V 2.下载sudo最新安装文件 sudo官方地址: https://www.sudo.ws/ 下载地址:https://www.sudo.ws/dist/ 3.解压 ...
- 智汀家庭云-开发指南Golang:设备场景
场景是指通过SA实现设备联动.例如,自动检测今天的天气情况,今天无雨,定时智能音箱播放浇花提醒,并且播报今天的天气情况. 根据自身需求,把多种控制并发的事情编辑成一个场景,并命名,可以通过场景控制很多 ...