首页 > 其他分享 >牛客练习赛107

牛客练习赛107

时间:2023-01-02 09:55:17浏览次数:60  
标签:练习赛 int rep 牛客 mod include 107 cc define

挺有难度的比赛。

A
求\((n!)!\mod m,n,m\le 1e6\)

容易发现n!>m之后答案为0。

B
仔细看题。

考虑两个序列中的1能不能都放在一号位可以的话就是最优的。

不能的话考虑一个放1号位另一个顺次放2,3,4...n

这样是代价为1容易发现代价恒大于等于1 故这样也是最优的。

C
注意到\(k>\sqrt n\)生成的k进制数就只有两位了

此时考虑整除分块对于\(n/k\)相同的那么首位都一样 末位形成等差数列 贡献除了最后一个也是等差数列的形式可以计算。

对于小于\(\sqrt n\)的直接暴力计算即可。

可谓是将根号分治和整除分块联系在了一起。

题解区有人发现了直接整除分块除了最后一个答案一直都是等差数列,很神奇。

D
考虑先对\(a_1\)进行操作

\(a_1\)中的0肯定不会变成1而\(a_1\)中的1可以变成0.

进一步可以发现序列中二进制位上0,1个数守恒可以进行交换。

将所有的0尽可能都放前面即可。

E
树上随机选择k个点求这k个点的LCA的期望,每个点都有概率。

还好这个\(k,1\le k\le 5\)

考虑枚举LCA=x 容易想到一个容斥就是选择的k个点在x子树内的概率-k个点在x任意儿子子树内的概率。

设\(P_x\)表示x子树内概率总和 那么答案为\(\sum x\cdot (P_x^k-P_{t1}^k-P_{t2}^k-...)\)

接下来考虑单点修改x那么就是从x到1的路径上的点的概率都要修改。

改写一下答案形式不然每个点的地方有两个地方需要修改。

改为\(\sum (x-F_x)\cdot P_x^k\)

左边是一个常数,考虑右边在树上的快速修改,利用树剖和线段树。

考虑线段树上区间的修改即把\(P_x^k\)修改为\((P_x-w)^k\)

如果\(k==1\)那么就可以直接修改了如果\(k==2\)考虑到\((p-w)^2=p^2-2pw-w^2\)需要再维护一个一次方和。

值得注意的是这个一次方和也需要再维护更新。注意到变成加法对于系数而言会更方便。

那么每次区间修改复杂度为\(k^2\)

总复杂度为\(mlog^2k^2\).维护高次方和还是很麻烦的一件事。

代码难度较高,于我不成问题。

code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000000000ll
#define inf 100000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define putl_(x) printf("%lld ",x);
#define get(x) x=read()
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<int,int>
#define mk make_pair
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define sq sqrt
#define l(w) t[w].l
#define r(w) t[w].r
#define L(w) s[w].l
#define R(w) s[w].r
#define yy p<<1|1
#define zz p<<1
#define sum(w) t[w].sum
#define S second
#define mod 1000000007
#define sc(A) scanf("%d",&A)
#define scs(A) scanf("%s",A);
#define put(A) printf("%d\n",A)
#define min(x,y) (x>=y?y:x)
#define max(x,y) (x>=y?x:y)
#define add(x,y) (x+y>=mod?x+y-mod:x+y)
#define sub(x,y) (x-y<0?x-y+mod:x-y)
using namespace std;
const int MAXN=200010;
int n,m,k,len,cnt;
int a[MAXN],f[MAXN],fa[MAXN],sz[MAXN],son[MAXN],top[MAXN],dfn[MAXN],w[MAXN];
int c[6][6];
ll g[MAXN<<2][6];
int tag[MAXN<<2];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1];
inline void add1(int x,int y)
{
	ver[++len]=y;
	nex[len]=lin[x];
	lin[x]=len;
}
inline void dfs(int x,int F)
{
	f[x]=a[x];sz[x]=1;fa[x]=F;
	go(x)
	{
		if(tn==F)continue;
		dfs(tn,x);
		f[x]=add(f[x],f[tn]);
		sz[x]+=sz[tn];
		if(sz[tn]>sz[son[x]])son[x]=tn;
	}
}
inline void dp(int x,int F)
{
	dfn[x]=++cnt;w[cnt]=x;
	top[x]=F;
	if(son[x])dp(son[x],F);
	go(x)
	{
		if(tn==fa[x]||tn==son[x])continue;
		dp(tn,tn);
	}
}
inline void build(int p,int l,int r)
{
	if(l==r)
	{
		g[p][0]=sub(w[r],fa[w[r]]);
		rep(1,k,i)g[p][i]=g[p][i-1]*f[w[r]]%mod;
		return;
	}
	int mid=(l+r)>>1;
	build(zz,l,mid);
	build(yy,mid+1,r);
	rep(0,k,i)g[p][i]=add(g[zz][i],g[yy][i]);
}
inline void pushdown(int p)
{
	for(int i=k;i>=1;--i)
	{
		int ans=0,ww=1,ans1=0;
		for(int j=0;j<=i;++j)
		{
			int cnt=g[zz][i-j]*c[i][j]%mod*ww%mod;
			ans=add(ans,cnt);
			cnt=g[yy][i-j]*c[i][j]%mod*ww%mod;
			ans1=add(ans1,cnt);
			ww=(ll)ww*tag[p]%mod;
		}
		g[zz][i]=ans;g[yy][i]=ans1;
	}
	tag[zz]=add(tag[zz],tag[p]);
	tag[yy]=add(tag[yy],tag[p]);
	tag[p]=0;
}
inline void change(int p,int l,int r,int L,int R,int w)
{
	if(L<=l&&R>=r)
	{
		tag[p]=add(tag[p],w);
		for(int i=k;i>=1;--i)
		{
			int ans=0,ww=1;
			for(int j=0;j<=i;++j)
			{
				int cnt=g[p][i-j]*c[i][j]%mod*ww%mod;
				ans=add(ans,cnt);
				ww=(ll)ww*w%mod;
			}
			g[p][i]=ans;
		}
		return;
	}
	int mid=(l+r)>>1;
	if(tag[p])pushdown(p);
	if(L<=mid)change(zz,l,mid,L,R,w);
	if(R>mid)change(yy,mid+1,r,L,R,w);
	rep(1,k,i)g[p][i]=add(g[zz][i],g[yy][i]);
}
inline void change(int x,int w)
{
	while(top[x]!=1)
	{
		change(1,1,n,dfn[top[x]],dfn[x],w);
		x=fa[top[x]];
	}
	change(1,1,n,dfn[1],dfn[x],w);
}
inline int ksm(int b,int p)
{
	int cnt=1;
	while(p)
	{
		if(p&1)cnt=(ll)cnt*b%mod;
		b=(ll)b*b%mod;p=p>>1;
	}
	return cnt;
}
inline void ask()
{
	int cc=1;
	rep(1,k,j)cc=(ll)f[1]*cc%mod;
	cc=g[1][k]*ksm(cc,mod-2)%mod;
	put(cc);
}
int main()
{
	//freopen("1.in","r",stdin);
	sc(n);sc(m);sc(k);
	c[0][0]=1;
	rep(1,k,i)
	{
		c[i][0]=1;
		rep(1,i,j)c[i][j]=add(c[i-1][j],c[i-1][j-1]);
	}
	rep(1,n,i)sc(a[i]);
	rep(2,n,i)
	{
		int x,y;
		sc(x);sc(y);
		add1(x,y);add1(y,x);
	}
	dfs(1,0);
	dp(1,1);
	build(1,1,cnt);
	ask();
	rep(1,m,i)
	{
		int x,w,cc;
		sc(x);sc(w);cc=sub(w,a[x]);
		change(x,cc);
		a[x]=w;f[1]=add(f[1],cc);
		ask();
	}
	return 0;
}
F 会更的!!!

标签:练习赛,int,rep,牛客,mod,include,107,cc,define
From: https://www.cnblogs.com/chdy/p/17019450.html

相关文章

  • 牛客小白月赛64 C题 题解
    题目链接题意描述这一题的意思其实就是,让你构造一个\(n*k\)的矩阵,使得第i列的总和为i,同时使得:每一列的任意两个数之间的差不大于1,且任意两行之间的总和差不大于1。......
  • SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too lo
    Laravel5.4默认使用utf8mb4字符编码,而不是之前的utf8编码。因此运行phpartisanmigrate 会出现如下错误:Illuminate\Database\QueryExceptionSQLSTATE[42000]:Syntaxe......
  • 牛客--64--F
    关键这个题目很值得学习呀!看着是不能记录所有的状态,但是可以映射一下,然后就是直接线性dp了代码#include<bits/stdc++.h>usingnamespacestd;constintM=2e6+5;co......
  • 大数据开发面试题,牛客上面试被问频率最高的几道面试题
    大数据开发面试题,牛客上面试被问频率最高的几道面试题一、Hadoop部分一、HDFS文件写入和读取过程****可灵活回答:1)HDFS读写原理(流程)2)HDFS上传下载流程3)讲讲(介绍下)HDFS4)HD......
  • ASEMI整流桥2W10,DB107S和KBP307封装参数对比
    编辑-ZASEMI整流桥2W10,DB107S和KBP307是很常见的型号,今天就把整流桥2W10,DB107S和KBP307的封装参数对比一小,以便大家在选型时有更好的参考。 2W10参数:型号:2W10封装:WOB......
  • ASEMI整流桥2W10,DB107S和KBP307封装参数对比
    编辑-ZASEMI整流桥2W10,DB107S和KBP307是很常见的型号,今天就把整流桥2W10,DB107S和KBP307的封装参数对比一小,以便大家在选型时有更好的参考。2W10参数:型号:2W10封装:WOB-4最大重......
  • 牛客网刷题笔记篇
    字符串篇字符串翻转链接地址importjava.util.*;publicclassSolution{publicStringtrans(Strings,intn){//writecodehereif(n=......
  • 107条Javascript的常用语句
    1、document.write(""); 输出语句2、JS中的注释为//3、传统的HTML文档顺序是:document->html->(head,body)4、一个浏览器窗口中的DOM顺序是:window->(navigator,screen,......
  • 牛客 --- 音量调节(递推dp)
    原题链接:https://ac.nowcoder.com/acm/problem/19990思路:1)很像电梯问题,升或降对应调高或调低,所以内部每次要考虑两个状态。说到内部,如何结合01背包找最大音量呢?2)我们知......
  • AcWing341. 洛谷P1073, NOIP2009 最优贸易
    AcWing题目传送门洛谷题目传送门题目大意\(~~~~~~\)一个投机倒把的奸商想要通过城市不太健全的贸易系统坑点钱,任意城市都可以买入或者卖出水晶球,他想尽量在便宜的城市买......