传送门

明明没参加过却因为点进去结果狂掉\(rating\)……

\(A\) 集合

如果我们记

\[f_k=\sum_{i=1}^nT^i{n-i\choose k}
\]

那么答案显然就是\(f_{k-1}\)

然后就可以开始推倒了

\[\begin{aligned}
f_k
&=\sum_{i=1}^nT^i{n-i\choose k}\\
&=\sum_{i=1}^nT^i{n-i-1\choose k}+\sum_{i=1}^nT^i{n-i-1\choose k-1}\\
&={1\over T}\sum_{i=2}^nT^i{n-i\choose k}+{1\over T}\sum_{i=2}^nT^i{n-i\choose k-1}\\
&={1\over T}\left(f_k-T{n-1\choose k}+f_{k-1}-T{n-1\choose k-1}\right)\\
&={1\over T}\left(f_k+f_{k-1}-T{n\choose k}\right)\\
\end{aligned}
\]

然后整理一下就可以得到

\[f_k={f_{k-1}-T{n\choose k}\over T-1}
\]

边界条件为\(f_0\),显然是个等比数列求和的形式,为

\[f_0={T(1-T^n)\over 1-T}
\]

直接递推就行了

顺便注意如果\(T=1\)那么答案显然是\(1\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=1e7+5,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
int inv[N],f[N],res,n,k,T,iv;
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d%d",&n,&k,&T);
inv[0]=inv[1]=1;fp(i,2,k)inv[i]=mul(P-P/i,inv[P%i]);
if(T==1)return puts("1"),0;
res=1,iv=ksm(T-1,P-2),f[0]=1ll*T*(P-iv)%P*(P+1-ksm(T,n))%P;
fp(i,1,k){
res=1ll*res*inv[i]%P*(n-i+1)%P,
f[i]=mul(dec(f[i-1],mul(T,res)),iv);
}
res=ksm(res,P-2);
printf("%d\n",mul(f[k-1],res));
return 0;
}

\(B\) 染色

点分是个啥我好像已经给忘了……

要求所有同色点对距离的最小值介于 \([L,R]\) 之间,我们可以用最小值大于等于\(L\)的答案减去最小值大于等于\(R+1\)的答案

那么考虑形如最小值大于等于\(k+1\)的答案怎么算,这个的意思就是要求对于\(u\)来说,所有到它的距离小于等于\(k\)的点的颜色要和它不同

首先有一个结论:如果我们按\(BFS\)序加入点,设当前加入的点为\(u\),且对另外两个已经加入的点\(x,y\),满足\(dis(u,x)\leq k\)且\(dis(u,y)\leq k\),则有\(dis(x,y)\leq k\)

证明:如果\(u\)到\(x,y\)的两条路径上没有分叉点,那么显然成立

如果有分叉点,我们记分叉点为\(w\),那么显然\(x,y\)中有一个点是在\(w\)的子树里的,不妨假设它为\(x\)。因为是按\(BFS\)序加入,所以\(x\)的深度小于\(u\),那么\(dis(x,w)\leq dis(u,w)\),所以\(dis(x,y)\leq dis(u,y)\leq k\)

那么我们按\(BFS\)序加入点,对于每个点\(u\),要满足所有和它距离不超过\(k\)的点的颜色互不相同,它的颜色也和它们不同

假设和它距离不超过\(k\)的点有\(s\)个,那么显然它的方案数就是\(m-s\),其中\(m\)为颜色总数

所以要怎么求和它距离不超过\(k\)的点的个数呢……点分树就可以了……点分树怎么写我已经忘光了所以请看代码自行理解

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=2e5+5,M=4e6+5,L=5e7+5,P=1e9+7;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void Add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int pool[L],*p=pool;
struct Bit{
int n,*c;
inline void upd(R int x){for(;x<=n;x+=x&-x)++c[x];}
inline int query(R int x){int res=0;cmin(x,n);for(;x;x-=x&-x)res+=c[x];return res;}
}f[M];int cur;
struct Eg{int nx,dis,sgn;Bit *bi;}E[M];int Head[N],tc;
int sz[N],mx[N],dep[N],vis[N],q[N],fa[N];
int size,rt,n,m,l,r,res1,res2;
void findrt(int u,int fa){
sz[u]=1,mx[u]=0;
go(u)if(v!=fa&&!vis[v])findrt(v,u),sz[u]+=sz[v],cmax(mx[u],sz[v]);
cmax(mx[u],size-sz[u]);
if(mx[u]<mx[rt])rt=u;
}
void dfs(int u,int sgn,int d){
int h=1,t=0;
dep[u]=d,fa[u]=0,q[++t]=u;
while(h<=t){
u=q[h++];
go(u)if(!vis[v]&&v!=fa[u])q[++t]=v,fa[v]=u,dep[v]=dep[u]+1;
E[++tc]={Head[u],dep[u],sgn,&f[cur]},Head[u]=tc;
}
f[cur].c=p,f[cur].n=dep[q[t]]+1,p+=f[cur++].n;
}
void solve(int u){
vis[u]=1;dfs(u,1,0);
int s=size;
go(u)if(!vis[v]){
dfs(v,-1,1);
rt=0,size=(sz[v]<sz[u])?sz[v]:s-sz[u],findrt(v,u);
solve(rt);
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),l=read(),r=read();
for(R int i=1,u,v;i<n;++i)u=read(),v=read(),Add(u,v),Add(v,u);
mx[0]=n+1,rt=0,size=n,findrt(1,0),solve(rt);
res1=res2=1,memset(vis,0,4*(n+1));
int h=1,t=0;q[++t]=1,vis[1]=1;
while(h<=t){
int u=q[h++],s1=0,s2=0;
for(int i=Head[u];i;i=E[i].nx){
if(E[i].dis<l)s1+=E[i].bi->query(l-E[i].dis)*E[i].sgn;
if(E[i].dis<r+1)s2+=E[i].bi->query(r+1-E[i].dis)*E[i].sgn;
E[i].bi->upd(E[i].dis+1);
}
res1=mul(res1,m-s1),res2=mul(res2,m-s2);
go(u)if(!vis[v])q[++t]=v,vis[v]=1;
}
printf("%d\n",dec(res1,res2));
return 0;
}

\(C\) 高尔夫

听说这是个数据结构题而且\(std\)有\(5kb\)

算了咕咕了

NOI2019省选模拟赛 第三场的更多相关文章

  1. NOI2019省选模拟赛 第六场

    传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...

  2. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  3. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  4. [NOI.AC]NOI2019省选模拟赛 第二场

    传送门 Solution A. 一共有\(T\)组数据 每次询问你\([l,r]\)中有多少个数能被他的所有数位整除(如果数位中含有\(0\)忽略掉) 数位dp,咕咕咕 B. 题面略 考虑一个个只有两 ...

  5. [NOI.AC 2018NOIP模拟赛 第三场 ] 染色 解题报告 (DP)

    题目链接:http://noi.ac/contest/12/problem/37 题目: 小W收到了一张纸带,纸带上有 n个位置.现在他想把这个纸带染色,他一共有 m 种颜色,每个位置都可以染任意颜色 ...

  6. CSP-S全国模拟赛第三场 【nan死了】

    mmt 居然第一步膜化乘除 都没看出来,没救了... 大概是贡献前缀和优化的做法 巨兔式讲解:大家都学会了么? 咱发现有大量的 (i/j , i%j ) 同时 对很多 c 产生了贡献,咱可以去优化这一 ...

  7. 【noi.ac-CSP-S全国模拟赛第三场】#705. mmt

    给定数组a[],b[] 求$$c_i=\sum_{j=1}^{i} a_{\left \lfloor \frac{n}{j} \right \rfloor}·b_{i \bmod j}$$ 大概就是对 ...

  8. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  9. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

随机推荐

  1. Jboss:The LogManager was not properly installed (you must set the "java.util.logging.manager" system prop

    可能是jboss的服务器版本选择不对 ,比如我本地的Jboss服务器版本是  jboss-as-web-7.0.2.Final,选择的服务器版本是JBOOS  V7.1  Runtime ,就会报上面 ...

  2. 迷你MVVM框架 avalonjs 1.3发布

    性能得到大幅改良的avalon1.3发布了. 修复$outer BUG 修复IE6-8下扫描加载Flash资源的OBJECT标签时,遇到它既没有innerHTML也没有getAttributeNode ...

  3. 24.Swap Nodes in Pairs (List; Two-Pointers)

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  4. jQuery的基础dom和css操作

    1.元素以及内容操作 $(function () { // alert($("a").html()); // 获取元素中间的html内容,包括标签和文本内容 // alert($( ...

  5. windows 安装git

    搭建环境:windo server 2012 方案: 服务器端:gitblit.下载地址:http://www.gitblit.com/ 客户端:git for windows.下载地址:https: ...

  6. 使用vim鼠标右键无法粘贴问题解决

    问题: Debian中通过终端使用vim,无法通过鼠标粘贴.这是由于一项默认的鼠标配置导致. 解决方法: vi /usr/share/vim/vim80/defaults.vim 查找set mous ...

  7. 点击panel滚动条滚动到底部

    $('#accordion').on('shown.bs.collapse', function () { var container = $(".admin-user .mx-scroll ...

  8. UIWebView清除缓存和cookie[转]

    现在项目遇到一个问题,游戏底层用Cocos2d-x,公告UI实现是用的UIWebView, 然后第一次在有网络的环境下运行公告UI,会加载url链接,同时就会自动存入缓存,当下次手机没有网络的环境下, ...

  9. Codeforces766A Mahmoud and Longest Uncommon Subsequence 2017-02-21 13:42 46人阅读 评论(0) 收藏

    A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...

  10. 机器学习—集成学习(Adaboost)

    一.原理部分: 二.sklearn实现: from sklearn.ensemble import AdaBoostClassifier from sklearn.datasets import lo ...