2021.7.27考试总结[NOIP模拟25]
罕见的改完了题
T1 random
一堆概率,一堆函数,一堆递归,一眼不可做,
但它只有一个参数,所以..
熠神本着“只有20太难看“的心态,通过样例三个出规律,口胡了一波$\frac{n^{2}-1}{9}$,
然后他切了,
他切了!
所以只有一个参数的题很可能是个结论,很可能可以打表,不要乱弃。。
正解颓柿子,先列出一个逆序对在长为n的序列中的贡献,然后列出答案的总式子,发现逆序对在长度大于等于二的序列里贡献都是4/3(打表/归纳法),
于是将式子化简,最后可以用等差数列求和公式$\sum_{i=1}^{n}i= \frac{n\left ( n+1 \right )}{2}$和$\sum_{i=1}^{n}i^{2}= \frac{n\left ( n+1 \right )\left ( 2n+1 \right )}{6}$化出O(1)。
code(这种代码真的用看吗:

1 #include<bits/stdc++.h>
2 #define debug exit(0)
3 #define LL long long
4 using namespace std;
5 const LL NN=1e18+5,p=998244353;
6 int T,n;
7 inline LL read(){
8 LL x=0,f=1;
9 char ch=getchar();
10 while(ch<'0'||ch>'9'){
11 if(ch=='-') f=-1;
12 ch=getchar();
13 }
14 while(ch>='0'&&ch<='9'){
15 x=(x<<1)+(x<<3)+(ch^48);
16 ch=getchar();
17 }
18 return x*f;
19 }
20 void write(int x){
21 if(x<0) putchar('-'), x=-x;
22 if(x>9) write(x/10);
23 putchar(x%10+'0');
24 }
25 inline int qpow(LL a,LL b){
26 int res=1; a%=p;
27 while(b){
28 if(b&1) res=1ll*res*a%p;
29 a=a*a%p;
30 b>>=1;
31 }
32 return res;
33 }
34 int main(){
35 T=read();
36 int inv=qpow(9,p-2);
37 while(T--){
38 n=read()%p;
39 write((1ll*n*n%p-1+p)%p*inv%p); putchar('\n');
40 }
41 return 0;
42 }
T1
T2 string
因为把前缀拼到后缀前面而爆零了。。
考虑计算以总串中第i位为结尾的后缀和以第i+1位为开始的前缀个数,二者相乘再求和就是答案。加上哈希70pts。
考虑优化。以总串中第i为结尾的后缀中最长后缀一定可以包含其他后缀,也就是说满足条件的后缀都是最长后缀的后缀。前缀同理
把字符串正反插入两颗trie树,通过DFS统计数量,然后二分找每个点的最长前后缀,记录答案。
code:

1 #include<bits/stdc++.h>
2 #define debug exit(0)
3 #define ULL unsigned long long
4 #define rin register int
5 #define int long long
6 using namespace std;
7 const int NN=2e5+5;
8 const ULL base=131;
9 int n,ls,l,r,pr[NN],ne[NN],tmp,ans;
10 ULL shas[NN],bas[NN],hs;
11 char s[NN],ch[NN];
12 inline int read(){
13 int x=0,f=1;
14 char ch=getchar();
15 while(ch<'0'||ch>'9'){
16 if(ch=='-') f=-1;
17 ch=getchar();
18 }
19 while(ch>='0'&&ch<='9'){
20 x=(x<<1)+(x<<3)+(ch^48);
21 ch=getchar();
22 }
23 return x*f;
24 }
25 void write(int x){
26 if(x<0) putchar('-'), x=-x;
27 if(x>9) write(x/10);
28 putchar(x%10+'0');
29 }
30 inline ULL get(int l,int r){
31 if(l>r) return 0;
32 return shas[r+1]-shas[l]*bas[r-l+1];
33 }
34 struct trie{
35 int to[NN][27],tot;
36 long long siz[NN];
37 ULL has[NN];
38 unordered_map<ULL,int>vis;
39 void insert(char ss[],int op){
40 int len=strlen(ss),root=1;
41 for(int i=0;i<len;i++){
42 int now=ss[i]-'a';
43 if(!to[root][now]){
44 to[root][now]=++tot;
45 if(!op) has[tot]=has[root]*base+(ULL)ss[i];
46 else has[tot]=ss[i]*bas[i]+has[root];
47 }
48 root=to[root][now]; siz[root]++;
49 }
50 }
51 void dfs(int fa,int s){
52 if(!s) return;
53 siz[s]+=siz[fa]; vis[has[s]]+=siz[s];
54 for(int i=0;i<26;i++) dfs(s,to[s][i]);
55 }
56 }nex,pre;
57 signed main(){
58 bas[0]=1; for(rin i=1;i<(NN);i++) bas[i]=bas[i-1]*base;
59 scanf("%s",s); ls=strlen(s);
60 n=read(); nex.tot=pre.tot=1; nex.vis[0]=pre.vis[0]=0;
61 for(rin i=1;i<=n;i++){
62 scanf("%s",ch);
63 pre.insert(ch,0);
64 reverse(ch,ch+strlen(ch));
65 nex.insert(ch,1);
66 }
67 for(rin i=1;i<=ls;i++) shas[i]=shas[i-1]*base+(ULL)s[i-1];
68 nex.dfs(0,1); pre.dfs(0,1);
69 for(int i=0;i<ls;i++){
70 l=0; r=i+1; tmp=0;
71 while(l<=r){
72 int mid=l+r>>1;
73 if(nex.vis.find(get(i-mid+1,i))!=nex.vis.end()) tmp=mid, l=mid+1;
74 else r=mid-1;
75 }
76 ne[i+1]=nex.vis[get(i-tmp+1,i)];
77 l=0; r=ls-i; tmp=0;
78 while(l<=r){
79 int mid=l+r>>1;
80 if(pre.vis.find(get(i,i+mid-1))!=pre.vis.end()) tmp=mid, l=mid+1;
81 else r=mid-1;
82 }
83 pr[i]=pre.vis[get(i,i+tmp-1)];
84 }
85 for(int i=0;i<ls;i++) ans+=ne[i]*pr[i];
86 write(ans); putchar('\n');
87 return 0;
88 }
T2
T3 queen
大力分类讨论,式子倒就那么几个,推出一两个后就很好推了
用到了$\sum_{i=1}^{n}\binom{i}{k}= \binom{n+1}{k+1}$和$\sum_{i=1}^{n}i^{2}= \frac{n\left ( n+1 \right )\left ( 2n+1 \right )}{6}$。
k大于5后只会有直线和斜线的情况,分类讨论k小等5,出题人题解讲的挺不当人清楚的
注意这题范围1e18,组合数的参数不能取模,然后计算时要疯狂%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%才不会爆
code:

1 #include<bits/stdc++.h>
2 #define debug exit(0)
3 #define int long long
4 using namespace std;
5 const int NN=1e18+5,p=3e5+7,inv6=250006,inv2=150004;
6 int T,ans;
7 int n,m,k,inv[p],fac[p];
8 inline int read(){
9 int x=0,f=1;
10 char ch=getchar();
11 while(ch<'0'||ch>'9'){
12 if(ch=='-') f=-1;
13 ch=getchar();
14 }
15 while(ch>='0'&&ch<='9'){
16 x=(x<<1)+(x<<3)+(ch^48);
17 ch=getchar();
18 }
19 return x*f;
20 }
21 void write(int x){
22 if(x<0) putchar('-'), x=-x;
23 if(x>9) write(x/10);
24 putchar(x%10+'0');
25 }
26 inline int qpow(int a,int b){
27 int res=1; a%=p;
28 while(b){
29 if(b&1) res=1*res*a%p;
30 a=a*a%p;
31 b>>=1;
32 }
33 return res;
34 }
35 void init(){
36 fac[0]=inv[0]=1;
37 for(int i=1;i<p;i++) fac[i]=fac[i-1]*i%p;
38 for(int i=1;i<p;i++) inv[i]=qpow(fac[i],p-2);
39 }
40 inline int C(int n,int m){ if(n<m) return 0; return fac[n]*inv[m]%p*inv[n-m]%p; }
41 inline int lucas(int n,int m){ if(!m) return 1; return C(n%p,m%p)*lucas(n/p,m/p)%p; }
42 inline int sigma1(int x){ return x*(x+1)%p*inv2%p; }
43 inline int sigma2(int x){ return x*(x+1)%p*(2*x+1)%p*inv6%p; }
44 signed main(){
45 T=read(); init();
46 while(T--){
47 n=read(); m=read(); k=read();
48 if(n>m) swap(n,m); int M=m%p,N=n%p,K=k%p;
49 if(k==1){ write(N*M%p); putchar('\n'); continue; }
50
51 ans=((N*lucas(M,K)%p+M*lucas(M,K)%p)%p+(N+M+1)%p*2%p*lucas(N,K)%p-lucas(N+1,K+1)%p*K%p*4%p+p)%p;
52
53 if(k==3){
54 int x=min(n,m/2)%p,y=min(n/2,m)%p;
55 ans=(ans+((M*N%p*(N-1)%p+sigma2(N-1))%p-(M+N)%p*sigma1(N-1)%p+p)*4%p)%p;
56 ans=(ans+(M*N%p*x%p-(2*N+M)%p*sigma1(x)%p+2*sigma2(x)%p+p)*2%p)%p;
57 ans=(ans+(M*N%p*y%p-(2*M+N)%p*sigma1(y)%p+2*sigma2(y)%p+p)*2%p)%p;
58 }
59 if(k==4){
60 int x=min(n,m/2)%p,y=min(n/2,m)%p,z=min(n,m)/2%p;
61 ans=(ans+((M*N%p*(N-1)%p+sigma2(N-1))%p-(M+N)%p*sigma1(N-1)%p+p)%p)%p;
62 ans=(ans+(M*N%p*x%p-(2*N+M)%p*sigma1(x)%p+2*sigma2(x)%p+p)*2%p)%p;
63 ans=(ans+(M*N%p*y%p-(2*M+N)%p*sigma1(y)%p+2*sigma2(y)%p+p)*2%p)%p;
64 ans=(ans+(M*N%p*z%p-2*(M+N)%p*sigma1(z)%p+4*sigma2(z)%p+p)*5%p)%p;
65 }
66 if(k==5){
67 int x=min(n,m)/2%p;
68 ans=(ans+(M*N%p*x%p-2*(M+N)%p*sigma1(x)%p+4*sigma2(x)%p+p)*2%p)%p;
69 }
70 write(ans); putchar('\n');
71 }
72 return 0;
73 }
T3
2021.7.27考试总结[NOIP模拟25]的更多相关文章
- 7.27考试总结(NOIP模拟25)[random·string·queue]
死亡的尽头,没有神 T1 random 解题思路 这波是找规律完胜了.. lby dalao根据样例找出了正确的式子:\(\dfrac{n^2-1}{9}\) 然而,我这个菜鸡却推出了这样一个错误的式 ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.7.29考试总结[NOIP模拟27]
T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- 2021.8.11考试总结[NOIP模拟36]
T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...
- 2021.7.15考试总结[NOIP模拟16]
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 2021.9.12考试总结[NOIP模拟51]
T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...
- 2021.9.9考试总结[NOIP模拟50]
T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...
随机推荐
- 原子操作cas
一.概念, 基于处理器指令,把比较和交换合成一个指令完成,保证了原子性: 因为是针对一个内存地址值的,一个内存地址指向一个变量,所以只对一个共享变量能保证原子性: 二.原子操作类 锁只有synchro ...
- Spring表达式
一.SpEL 其中,直接写也可以赋值,' ' 单引号引起来后成为一个字符串对象,可以调用String的方法: 二.引用另外一个bean 装配这个类的bean: 1.第一种方法,property标签中使 ...
- centos7关于防火墙的一些操作
防火墙相关 # 检查防火墙状态 systemctl status firewalld # 开启防火墙 systemctl start firewalld # 关闭防火墙 systemctl stop ...
- 常用CSS的布局问题;
一.溢出文案省略号显示: //当文字长度超过50px会已省略好的方式显示: width:50px; overflow: hidden; text-overflow: ellipsis; white-s ...
- rune和byte在处理字符/字符串中的应用.
rune和byte在处理字符/字符串中的应用. 定义: rune是int32的别名,-2147483648->2147483647,常用来表示UNICODE字符集,可以用来处理包含中文/非中文的 ...
- vue2.0 前端框架
在正式开始先复习一下js基础.因为vue最通终也要操作这些元素,vue和以前学的js并不挂勾,他和传统的jquert 设计理念相反 ## js 数据类型 1 基本类型 number string ...
- symfony中模板生成路径两种方式
1. 使用url('route_a_b_c') 这种方式会是全路径 : http://www.test.com/a/b/c 2. 使用path('route_a_b_c') 这种方式只是路径: /a ...
- Jmeter系列(36)- Access Log Sampler
简介 Access Log Sampler 是个非常有用的工具,可以收集和分析真实用户操作的数据,并可用于流量分析.常见的就是我们的nginx的access.log 日志 使用 access.log ...
- Chrome插件 - Modify Headers for Google Chrome(IP欺骗)
前景: 该篇随笔的由来:公司某项目(B/S架构)最近新加了一个后台日志功能,需要抓取到访问项目的主机IP,记录目标主机的操作,因此就需要不同得IP访问.并且项目专用浏览器是Chrome内核. Modi ...
- JDBC 基础入门
由于我也是初学参考的是网上的或者是培训机构的资料所以可能会有错误的信息,仅供参考 一.什么是JDBC(Java Data Base Connectivity)? java程序连接数据库,JDBC是由S ...