【超好懂的比赛题解】National Taiwan University NCPC Preliminary 2021 比赛题解

部署运行你感兴趣的模型镜像

title : National Taiwan University NCPC Preliminary 2021
date : 2022-7-29
tags :ACM,练习记录
author : LINNO


National Taiwan University NCPC Preliminary 2021 题解(BEJ)

B - Apple Tree

//#pragma GCC optimize("Ofast", "inline", "-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define int long long
using namespace std;
const int N=2e6+7;
const int mod=1e9+7;

//int read(){	int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=f*-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
//void write(int x){if(x>9) write(x/10);putchar(x%10+'0');}
struct E{
	int v,w,nxt;
}e[N];
int head[N],cnt=0;
inline void addedge(int u,int v,int w){
	e[++cnt]=(E){v,w,head[u]};head[u]=cnt;
}

int dp[N],n,ans=0;

inline void dfs(int x,int f){
	for(int i=head[x];i;i=e[i].nxt){
		int to=e[i].v;
		if(to==f) continue;
		dfs(to,x);
		dp[x]=max(dp[x],dp[to]+dp[x]-e[i].w*2);
	}
}

void Solve(){
	cin>>n;
	for(int i=1;i<=n;++i) cin>>dp[i];
	for(int i=1,u,v,w;i<n;++i){
		cin>>u>>v>>w;
		addedge(u,v,w);
		addedge(v,u,w);
	}
	dfs(1,0);
	for(int i=1;i<=n;++i) ans=max(dp[i],ans);
	cout<<ans<<"\n";
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
//  freopen("in.cpp","r",stdin);
//  freopen("out.cpp","w",stdout);
	int T=1;
//	cin>>T;
//	clock_t start,finish;
//	start=clock();
	while(T--){
		Solve();
	}
//	finish=clock();
//	cerr<<((double)finish-start)/CLOCKS_PER_SEC<<endl;
	return 0;
}

E - Identity Subset

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N=1e5+50;
inline int phi(int n)
{
    int zc=n,all=sqrt(n);
    for(int i=2;i<=all;i++)
	{
		if(n%i!=0)continue;
    	zc=zc/i*(i-1);
    	while(n%i==0)n/=i;
    }
    if(n>1)zc=zc/n*(n-1);
    return zc;
}
inline int pow(int x,const int y,const int mod)
{
	int res=1;
	for(int i=1;i<=y;i<<=1,x=(long long)x*x%mod)if(i&y)res=(long long)res*x%mod;
	return res;
}
ll q[100001];
inline int G(const int m)
{
	const int PHI=phi(m);
	q[0]=0;
	const int limit=sqrt(PHI);int zc=PHI;
	for(int i=2;i<=limit;i++)
		if(zc%i==0)
		{
			q[++q[0]]=PHI/i;
			while(zc%i==0)zc/=i;
		}
	if(zc>1)zc=q[++q[0]]=PHI/zc;
	for(int g=2;;g++)
	{
		bool fla=1;
		if(pow(g,PHI,m)!=1)continue;
		for(int i=1;i<=q[0];i++)
			if(pow(g,q[i],m)==1)
			{
				fla=0;
				break;
			}
		if(fla)return g;
	}
}
ll p,g;
ll a[N],b[N],c[N];
bitset<N>bb;
bitset<N>temp1,temp2;
signed main()
{
	scanf("%lld",&p);
    g=G(p)%p;
    //cout<<g<<endl;
    for(int i=1;i<p;++i)
    {
        scanf("%lld",&a[i]);
        a[i]%=p;
    }
    ll now=1;
    for(int i=0;i<p-1;++i)
    {
        b[now]=i;
        now=(1ll*now*g)%p;
    }
    for(int i=1;i<p;++i)
    {
        if(a[i]==0)
            c[i]=-1;
        else c[i]=b[a[i]];
    }
    for(int i=1;i<p;++i)
    {
        if(a[i]==0)
            continue;
        temp1=(bb<<c[i]);
        temp2=(bb>>(p-1)-c[i]);
        bb|=temp1;
        bb|=temp2;
        bb[c[i]]=1;
    }
    if(bb[0])
    {
        cout<<"Yes";
    }
    else cout<<"No";
    return 0;
}

J - Hot Potato

//#pragma GCC optimize("Ofast", "inline", "-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define int long long
using namespace std;
const int N=2e5+7;
const int mod=1e9+7;

//int read(){	int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=f*-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
//void write(int x){if(x>9) write(x/10);putchar(x%10+'0');} 

int n,mp[22][22],ans[N],inv[N],dp[(1<<20)+5][22];

inline int fpow(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1; 
	}
	return res;
}

void Solve(){
	cin>>n;
	for(int i=0;i<=n;++i) inv[i]=fpow(i,mod-2); 
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			cin>>mp[i][j];
		}
	}
	dp[1][1]=1;
	for(int i=1;i<(1<<n);++i){
		for(int j=1;j<=n;++j){
			if(!(i&(1<<(j-1)))) continue;
			int cnt=0;
			for(int k=1;k<=n;++k){
				if(mp[j][k]&&!(i&(1<<(k-1)))) ++cnt;
			}
			for(int k=1;k<=n;++k){
				if(mp[j][k]&&!(i&(1<<(k-1)))) dp[i|(1<<(k-1))][k]=(dp[i|(1<<(k-1))][k]+dp[i][j]*inv[cnt]%mod)%mod;
			}
			if(!cnt) ans[j]=(ans[j]+dp[i][j])%mod; 
		}
	}
	for(int i=1;i<=n;++i) cout<<ans[i]<<" ";
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
//  freopen("in.cpp","r",stdin);
//  freopen("out.cpp","w",stdout);
	int T=1;
//	cin>>T;
//	clock_t start,finish;
//	start=clock();
	while(T--){
		Solve();
	}
//	finish=clock();
//	cerr<<((double)finish-start)/CLOCKS_PER_SEC<<endl;
	return 0;
}

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RWLinno

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值