Noip模拟42 2021.8.17
T1 卷
一看跟没有上司的舞会一样,直接敲了然后试个自己造的样例对了就跑了。。。
然而把它想简单了,乘积取模,还能比大小吗?????
显然不能
所以直接让对数的加和跟着$dp$直接一起跑,比大小的都用对数就行
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int AE86(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}
8 return x*f;
9 }
10 const int NN=2e5+5,p=1e9+7;
11 int n,w[NN],dp[NN][2];
12 double lg[NN],l[NN][2];
13 struct SNOW{int fr,to,next;};SNOW e[NN<<1]; int head[NN],rp;
14 inline void add(int x,int y){
15 e[++rp]=(SNOW){x,y,head[x]};head[x]=rp;
16 e[++rp]=(SNOW){y,x,head[y]};head[y]=rp;
17 }
18 inline void dfs(int f,int x){
19 (dp[x][0]*=w[x])%=p; l[x][0]+=lg[x];
20 for(int i=head[x],y;i;i=e[i].next) if((y=e[i].to)!=f){
21 dfs(x,y);
22 (dp[x][1]*=(l[y][1]>l[y][0]?dp[y][1]:dp[y][0]))%=p;
23 (dp[x][0]*=dp[y][1])%=p;
24 l[x][1]+=max(l[y][1],l[y][0]);
25 l[x][0]+=l[y][1];
26 }
27 }
28 namespace WSN{
29 inline short main(){
30 n=AE86();for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=1;
31 for(int i=1;i<=n;i++) w[i]=AE86(),lg[i]=log(w[i]);
32 for(int i=1;i<n;i++) add(AE86(),AE86());
33 // for(int i=1;i<=rp;i++) cout<<e[i].fr<<" "<<e[i].to<<endl;
34 dfs(0,1);
35 printf("%lld\n",l[1][0]>l[1][1]?dp[1][0]:dp[1][1]);
36 return 0;
37 }
38 }
39 signed main(){return WSN::main();}
T2 简单题
组合数学。。。。。不会,永远不会。。。。。。
发现每个偶数都可以拆成一个奇数乘$2^k$得到
不妨把能用那个奇数得到的偶数都划分给那个奇数
如果一个集合选择了这个奇数,那么这个集合相应的选择$x*2^0,x*2^2,x*2^4,x*2^6...$
另外的集合选择剩下的$x*2^1,x*2^3...$,我们分别叫这两种选择的个数为一个数$x$的偶数权和奇数权
这样我们会发现,有时候左右选择不同,两个集合会有一定的数量上的差值,即有时$偶数权-奇数权=1$
因为这个数可能只有偶数个偶数和他构成关系,这样每次进行分配,两个集合都会有相差$1$
那么,我们假设把所有偶数权的放到一个集合,那么算出他集合内元素个数$sum$,
再相应的算出偶数权比奇数权多$1$的奇数个数$Y$,奇数偶数权相等的个数$X$
那么答案可以表示为$2^X*C_{Y}^{sum-m}$
自认为计算这几个量的过程不太好说,也比较喵,所以直接看码吧。
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int AE86(){
5 int x=0,f=1; char ch=getchar();
6 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
7 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}
8 return x*f;
9 }
10 const int NN=10000020,p=10000019;
11 int n,q,h[NN],v[NN],sum,num[100],X,Y;
12 inline int qmo(int a,int b){
13 int ans=1,c=p; a%=c;
14 while(b){
15 if(b&1) ans=(ans*a)%c;
16 b>>=1; a=(a*a)%c;
17 }return ans;
18 }
19 inline void pre(){
20 h[0]=h[1]=1; v[0]=v[1]=1;
21 for(int i=2;i<=10000018;i++) h[i]=h[i-1]*i%p;
22 v[10000018]=qmo(h[10000018],p-2);
23 for(int i=10000017;i>=2;i--) v[i]=v[i+1]*(i+1)%p;
24 }
25 inline int C(int n,int m){
26 if(n<0||m<0||n<m) return 0;
27 return h[n]*v[n-m]%p*v[m]%p;
28 }
29 inline int lucas(int n,int m){
30 if(!m) return 1;
31 return lucas(n/p,m/p)*C(n%p,m%p)%p;
32 }
33 namespace WSN{
34 inline short main(){
35 n=AE86(); q=AE86(); pre();
36 int cnt=0;
37 while(pow(2ll,cnt)<n){
38 int mi=pow(2ll,cnt),f=n/mi;
39 num[cnt]=(f+1)/2; ++cnt;
40 }--cnt;
41 for(int i=2;i<=cnt;i+=2) sum+=num[i];
42 for(int i=0;i<=cnt;i++) num[i]-=num[i+1];
43 for(int i=0;i<=cnt;i++)
44 if(i&1) X+=num[i];
45 else Y+=num[i];
46 sum+=(1+n)>>1;
47 int aa=qmo(2,X);
48 while(q--) printf("%lld\n",aa*lucas(Y,sum-AE86())%p);
49 return 0;
50 }
51 }
52 signed main(){return WSN::main();}
T3 粉丝
求划分数,先科普两种$dp$
$f_{i,j}$表示$dp$到$i$,总和为$j$的划分数,则可以按照完全背包$dp$,每次枚举$i$选择了几个即可
$g_{i,j}$表示划分了$i$个数,总和为$j$的划分数,这是经典的划分数$dp$,有$g_{i,j}=g_{i-1,j}+g_{i,j-i}$
然后发现可以之考虑下界,最后按照前缀和的处理方式算答案就行
$dp$分成两部分,前$\sqrt n$用$f_{i,j}dp$,后面的用$g_{i,j}dp$,最后整合答案即可
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(int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
13 }using namespace AE86;
14
15 const int NN=3e5+1;
16 int x,y,n,p,f[NN],g[NN],s[NN],B;
17 inline int work(int ss){
18 if(ss>n) return 0;
19 int m=max(B,ss); f[0]=g[0]=s[0]=1ll;
20 for(int i=ss;i<m;i++)
21 for(int j=i;j<=n;j++) (f[j]+=f[j-i])%=p;
22 for(int i=1;i<=n/m;i++){
23 int t=i*m;
24 for(int j=i;j+t<=n;j++) (g[j]+=g[j-i])%=p;
25 for(int j=0;j+t<=n;j++) (s[j+t]+=g[j])%=p;
26 }
27 int ans=0;
28 for(int i=0;i<=n;i++) (ans+=f[i]*s[n-i]%p)%=p;
29 memset(f,0,sizeof(f));
30 memset(g,0,sizeof(g));
31 memset(s,0,sizeof(s));
32 return ans;
33 }
34 namespace WSN{
35 inline short main(){
36 x=read();y=read();n=read();p=read(); B=sqrt(n);
37 write((work(x)-work(y+1)+p)%p);
38 return 0;
39 }
40 }
41 signed main(){return WSN::main();}
T4 字符串
刚学会$manacher$,先沽了
纯属恶搞,如此优秀的通过率谁不爱呢
Noip模拟42 2021.8.17的更多相关文章
- Noip模拟79 2021.10.17(题目名字一样)
T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...
- Noip模拟55 2021.9.17(打表大胜利)
T1 skip 普通$dp$很好打: $f[i]=max(f[j]-\sum_{k=1}^{K}k+a_i)$ 就是要注意边界问题很烦人. 1 #include<bits/stdc++.h> ...
- Noip模拟18 2021.7.17 (文化课专场)
T1 导弹袭击(数学) 显然,我们要找到最优的A,B使得一组a,b优于其他组那么可以列出: $\frac{A}{a_i}+\frac{B}{b_i}<\frac{A}{a_j}+\frac{B} ...
- Noip模拟8 2021.6.17
T1 星际旅行 仔细一看,发现像一个欧拉路(简称一笔画). 满足"可以一笔画"的条件是: 1.所有点都有偶数条连边; 2.有偶数个点连奇数条边; 满足以上两个条件的任意一个即可一笔 ...
- Noip模拟70 2021.10.6
T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- Noip模拟63 2021.9.27(考场惊现无限之环)
T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...
- Noip模拟61 2021.9.25
T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...
随机推荐
- docker&flask快速构建服务接口(二)
系列其他内容 docker快速创建轻量级的可移植的容器✓ docker&flask快速构建服务接口✓ docker&uwsgi高性能WSGI服务器生产部署必备 docker&g ...
- WebDriverAgent重签名爬坑记
接上一篇博文,已经配置好了Xcode环境,那接下来要完成的就是重签名WebDriverAgent.在讲重签名之前,我们还是先来了解下WebDriverAgent,熟悉的朋友,可以直接跳过. WebDr ...
- 博主有偿带徒 《编程语言设计和实现》《MUD游戏开发》《软件破解和加密》《游戏辅助外挂》《JAVA开发》
<考研专题>操作系统原理 理论解答:8K 实战 1.5W CPU设计 理论解答:1W 实战 2.5W <编程语言设计和实现>初窥门径<5K>:编译原理.编译设计小试 ...
- Weblogic Coherence组件漏洞初探CVE-2020-2555
Weblogic Coherence组件漏洞初探CVE-2020-2555 2020年1月,互联网上爆出了weblogic反序列化远程命令执行漏洞(CVE-2020-2555),Oracle Fusi ...
- weblogic漏洞初探之CVE-2015-4852
weblogic漏洞初探之CVE-2015-4852 一.环境搭建 1. 搭建docker 这里用了vulhub的环境进行修改:https://vulhub.org/ 新建个文件夹,创建两个文件doc ...
- jsp连接mysql数据库 ——查询
<%@ page language="java" import="java.sql.*" pageEncoding="utf-8"%& ...
- mybatis零碎
< < 小于号 > > 大于号 & & 和 ' ' 单 ...
- Shell系列(7)- 通配符
通配符 通配符 作用 ? 匹配一个任意字符 * 匹配0个或任意多个任意字符,也就是可以匹配任何内容 [] 匹配中括号中任意一个字符.例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c. ...
- nginx 利用return实现301跳转
第一种: server { location / { rewrite ^/(.*)$ http://www.baidu.com/$1 permanent; } } 第二种: server { loca ...
- python 文件夹扫描
扫描指定文件夹下的文件.或者匹配指定后缀和前缀的函数. 假设要扫描指定文件夹下的文件,包含子文件夹,调用scan_files("/export/home/test/") 假设要扫描 ...