3.25 模拟赛

T1

题目大意:

给出一个数$n$,求有多少个正回文数对$(p,q)$满足$p+q=n$

思路:

T2

题目大意:

给出一个带边权的完全图,定义树上一个点的权值$f(x)$为其到根的路径上边权的最小值,特别的$f(root)=0$,一个树的权值为所有点的权值和

求每个点的最小权值生成树

思路:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 #define ll long long
12 #define db double
13 #define inf 2139062143
14 #define MAXN 1010
15 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
16 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
17 #define ren for(register int i=fst[x];i;i=nxt[i])
18 #define pb(i,x) vec[i].push_back(x)
19 #define pls(a,b) (a+b)%MOD
20 #define mns(a,b) (a-b+MOD)%MOD
21 #define mul(a,b) (1LL*(a)*(b))%MOD
22 using namespace std;
23 inline int read()
24 {
25     int x=0,f=1;char ch=getchar();
26     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
27     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
28     return x*f;
29 }
30 int n,mp[MAXN][MAXN],mn=inf,q[MAXN],l=1,r,vis[MAXN];
31 ll dis[MAXN];
32 int main()
33 {
34     n=read();rep(i,1,n) dis[i]=inf;rep(i,1,n) rep(j,i+1,n)
35         mp[i][j]=mp[j][i]=read(),mn=min(mn,mp[i][j]),
36         dis[i]=min(dis[i],(ll)mp[i][j]<<1),dis[j]=min(dis[j],(ll)mp[i][j]<<1);
37     rep(i,1,n) dis[i]-=(mn<<1);rep(i,1,n) rep(j,1,n) if(i^j) mp[i][j]-=mn;
38     rep(i,1,n) q[++r]=i,vis[i]=1;int x;
39     while(l<=r)
40     {
41         x=q[l++],vis[x]=0;rep(i,1,n) if(x^i&&dis[i]>dis[x]+mp[x][i])
42             {dis[i]=dis[x]+mp[x][i];if(!vis[i]) vis[i]=1,q[++r]=i;}
43     }
44     rep(i,1,n) printf("%lld ",dis[i]+(ll)mn*(n-1));
45 }

T3

题目大意:

思路:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 #define ll long long
12 #define db double
13 #define inf 2139092143
14 #define MAXN 200100
15 #define MOD 998244353
16 #define rep(i,s,t) for(register int i=(s),i##end=(t);i<=i##end;++i)
17 #define dwn(i,s,t) for(register int i=(s),i##end=(t);i>=i##end;--i)
18 #define ren for(int i=fst[x];i;i=nxt[i])
19 #define pls(a,b) (a%MOD+b%MOD)%MOD
20 #define mns(a,b) (a%MOD-b%MOD+MOD)%MOD
21 #define mul(a,b) (1LL*(a%MOD)*(b%MOD))%MOD
22 using namespace std;
23 inline int read()
24 {
25     int x=0,f=1;char ch=getchar();
26     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
27     while(isdigit(ch)) {x=x*10+ch-‘0‘,ch=getchar();}
28     return x*f;
29 }
30 int n,m,rev[MAXN],l2[MAXN],pw[30],ipw[30],A[MAXN],B[MAXN];
31 int g[18][MAXN],f[18][MAXN],h[18][MAXN],iv[MAXN],s[30][30];
32 int ans,p[MAXN],ip[MAXN],tmp[MAXN];
33 int q_pow(int bas,ll t,int res=1)
34 {
35     for(;t;t>>=1,bas=mul(bas,bas))
36         if(t&1) res=mul(res,bas);return res;
37 }
38 void ntt(int *a,int n,int f)
39 {
40     rep(i,0,n-1) if(i<rev[i]) swap(a[i],a[rev[i]]);
41     for(int i=1;i<n;i<<=1)
42     {
43         int wn= f==1?pw[l2[i]+1]:ipw[l2[i]+1];
44         for(int j=0;j<n;j+=(i<<1))
45         {
46             int w=1,x,y;
47             for(int k=0;k<i;k++,w=mul(w,wn))
48                 x=a[j+k],y=mul(a[j+k+i],w),a[j+k]=pls(x,y),a[j+k+i]=mns(x,y);
49         }
50     }
51     if(f==1) return ;int nv=q_pow(n,MOD-2);
52     rep(i,0,n-1) a[i]=mul(a[i],nv);
53 }
54 void solve(int *a,int *b,int lmt)
55 {
56     int t=l2[lmt];rep(i,0,lmt-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(t-1));
57     ntt(a,lmt,1);ntt(b,lmt,1);rep(i,0,lmt-1) a[i]=mul(mns(2,mul(a[i],b[i])),a[i]);
58     ntt(a,lmt,-1);
59 }
60 int C(int n,int m){int res=ip[m];dwn(i,n,n-m+1) res=mul(res,i);return res;}
61 void inv(int *a,int *f,int lmt)
62 {
63     f[0]=q_pow(a[0],MOD-2);
64     for(int t=2;t<=lmt;t<<=1)
65         {rep(i,0,t-1) tmp[i]=a[i];solve(f,tmp,t<<1);rep(i,t,(t<<1)-1) f[i]=0;}
66 }
67 void mem(int *a,int n,int val) {rep(i,0,n) a[i]=val;}
68 int main()
69 {
70     n=read(),m=read();ll num;rep(i,2,n<<2)
71     {
72         l2[i]=l2[i>>1]+1;
73         if(!pw[l2[i]]) pw[l2[i]]=q_pow(3,(MOD-1)/i),ipw[l2[i]]=q_pow(pw[l2[i]],MOD-2);
74     }
75     int t=l2[n]+2,lmt=1<<t;p[0]=ip[0]=s[0][0]=1;
76     rep(i,1,lmt) p[i]=mul(p[i-1],i);rep(i,1,lmt) ip[i]=q_pow(p[i],MOD-2);
77     rep(i,1,m) rep(j,1,i) s[i][j]=pls(s[i-1][j-1],mul(s[i-1][j],j));
78     rep(j,0,m) rep(i,0,(lmt>>1)-1)
79     {
80         num=1LL*i*(i-1)>>1;g[j][i]=mul(C(num%MOD,j),q_pow(2,(num-j+MOD-1)%(MOD-1)));
81         if(i) h[j][i]=mul(g[j][i],ip[i-1]);g[j][i]=mul(g[j][i],ip[i]);
82     }
83     inv(g[0],iv,lmt>>1);rep(i,0,lmt-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(t-1));
84     rep(i,0,m) ntt(g[i],lmt,1);ntt(iv,lmt,1);
85     rep(k,0,m)
86     {
87         mem(tmp,lmt,0);rep(j,1,k) rep(i,0,lmt-1)
88             tmp[i]=pls(tmp[i],mul(g[j][i],f[k-j][i]));ntt(tmp,lmt,-1);
89         rep(i,0,(lmt>>1)-1) f[k][i]=mns(h[k][i],tmp[i]);ntt(f[k],lmt,1);
90         rep(i,0,lmt-1) f[k][i]=mul(f[k][i],iv[i]);
91         ntt(f[k],lmt,-1);rep(i,lmt>>1,lmt+5) f[k][i]=0;
92         ans=pls(ans,mul(mul(f[k][n],p[n-1]),mul(s[m][k],p[k])));ntt(f[k],lmt,1);
93     }
94     printf("%d\n",ans);
95 }

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/10600897.html

时间: 2024-08-30 18:00:42

3.25 模拟赛的相关文章

『8.25 模拟赛』外卖 (atcoder 100e)

题目链接 题目描述 众所周知,\(cky\)喜欢点外卖. 已知可选的商品有\(n\)种,\(cky\)由于胃容量问题只能点两份(不能一种点两份).\(cky\)要在防止营养过剩的情况下选择美味度最高的搭配. 具体的,对于每第\(i\)个商品,\(i\)正好是其营养成分,\(s_i\)表示其美味度(商品从\(0\)开始编号). 对于每种搭配\((a,b)\),其营养程度为(\(a|b\)其中\(|\)表示二进制下的按位或),其美味度为\(s_a+s_b\). 即\(cky\)要选择满足\(a|b\

10.25模拟赛

NP(np) Description LYK 喜欢研究一些比较困难的问题, 比如 np 问题. 这次它又遇到一个棘手的 np 问题. 问题是这个样子的: 有两个数 n 和 p, 求 n 的阶乘 对 p 取模后的结果. LYK 觉得所有 np 问题都是没有多项式复杂度的算法的,所以它打算求助即将要参加 noip 的你, 帮帮 LYK 吧! Input ? 输入一行两个整数 n,p. Output 输出一行一个整数表示答案. 数据范围 对于 20%的数据: n,p<=5. 对于 40%的数据: n,

2017.11.25【NOIP提高组】模拟赛A组

2017.11.25[NOIP提高组]模拟赛A组 T1 3467. [NOIP2013模拟联考7]最长上升子序列(lis) T2 3468. [NOIP2013模拟联考7]OSU!(osu) T3 3472. [NOIP2013模拟联考8]匹配(match) T1 有转移方程f[i]=max{f[j]}+1,a[j]<a[i] 可以用线段树+离散化维护这个方程,因为涉及以往状态可以用主席树维护 打太丑爆空间了 Code 1 #include<cstdio> 2 #include<c

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

bzoj2741: 【FOTILE模拟赛】L

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2679  Solved: 766[Submit][Status][Discuss] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一

20161026模拟赛解题报告

20161026模拟赛解题报告 By shenben T1 按照题目说的模拟即可 但这题有一个神坑:当25个字母都已经一一对应完毕后,剩下的两个字母默认对应. T2 所有的逆序对之间都会连边,求最大独立点集. 表面上是个图论题,其实是个LIS O(nlogn)求最长上升子序列的长度即可AC T3 第一次手贱,用链表存边,这是一个稠密图啊!!应该用邻接矩阵啊. 明明可以用floyed跑,非要dfs乱搞.结果10分.玩砸了吧. 最后只改到了40分. 网上的题解(没看懂): 首先这是一个神奇的图,叫做