ZR 19CSP-S赛前冲刺day5 密码小明

T1
考虑树是0花费。
T2
二分容斥。
容斥是\(2^k\)
考虑到60以上的贡献系数都是1。
dp出容斥系数。
容斥就是\(log\)
(高精开根是真的神仙,get到了)
T3
=三个题。
sub1 贪心选取。
sub2 01trie
sub3 FMT
FWT只学了\(or and\),没学\(xor\)
以后可能会背板子了

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
const int _=5e5+7;
const int oo=0x3f3f3f3f;
int read() {
	int x=0,f=1;char s=getchar();
	for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
	for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
	return x*f;
}
int n,m,ru[_];
struct node {
	int v,nxt;
}e[_<<1];
int head[_],tot;
void add(int u,int v) {
	e[++tot].v=v;
	e[tot].nxt=head[u];
	head[u]=tot;
}
int vis[_];
void dfs(int u,int fa) {
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt) {
		int v=e[i].v;
		if(v==fa||vis[v]) continue;
		dfs(v,u);
	}
}
int main() {
	n=read(),m=read();
	FOR(i,1,m) {
		int u=read(),v=read();
		add(u,v),add(v,u);
	}
	int ans=0;
	FOR(i,1,n) if(!vis[i]) dfs(i,0),ans++;
	ans=m-n+ans;
	cout<<ans<<'\n';
	return 0;
}
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ROF(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
const ll oo=0x3f3f3f3f3f3f3f3f;
int read() {
	int x=0,f=1;char s=getchar();
	for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
	for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
	return x*f;
}
int m,k;ll cnt[100];
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
ll q_pow(ll a,ll b) {
	if(pow(a,b)>=oo) return oo;
	ll ans=1;
	while(b) {
		if(b&1) ans=ans*a;
		a=a*a,b>>=1;
	} return ans;
}
ll calc(ll x,int i) {
	ll val=pow(x,1.0/i);
	while(q_pow(val+1,i)<=x) val++;
	while(q_pow(val,i)>x) val--;
	return val;
}
bool check(ll x) {
	ll ans=0;
	for(int i=1;i<=60;++i) ans+=cnt[i]*calc(x,i);
	return ans>=m;
}
void solve() {
	m=read(),k=read();
	FOR(i,0,60) cnt[i]=0;
	FOR(i,1,k) {
		int x=read();
		ROF(j,60,1) cnt[min(j*x/gcd(x,j),60)]-=cnt[j];
		cnt[x]++;
	}
	ll l=1,r=1e17,ans=0;
	while(l<=r) {
		ll mid=(l+r)>>1;
		if(check(mid)) ans=mid,r=mid-1;
		else l=mid+1;
	} cout<<ans<<"\n";
}
int main() {
	int T=read();
	while(T-->0) solve();	
	return 0;
}
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ROF(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
const int oo=0x3f3f3f3f;
const int _=1e5+7;
int read() {
	int x=0,f=1;char s=getchar();
	for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
	for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
	return x*f;
}
int n,m,a[_];
namespace sub1 {
	int vis[_],ans;
	int MAIN() {
		ROF(i,22,0) {
			int cnt=0;
			FOR(j,1,n) if(!vis[j]&&(a[j]&(1<<i))) cnt++;
			if(cnt>=2) {
				FOR(j,1,n) if(!vis[j]&&!(a[j]&(1<<i))) vis[j]=1;
				ans|=1<<i;
			}
		}
		ll cnt=0;
		FOR(j,1,n) cnt+=!vis[j];
		cnt*=cnt-1;
		cout<<ans<<" "<<cnt/2<<"\n";
		return 0;
	}
}
namespace sub2 {
	int ch[_*22][2],siz[_*22],cnt;
	void insert(int val) {
		int p=0;
		ROF(i,22,0) {
			bool k=(val>>i)&1;
			if(!ch[p][k]) ch[p][k]=++cnt;
			p=ch[p][k];
		} siz[p]++;
	}
	pair<int,int> query(int val) {
		int p=0,ans=0;
		ROF(i,22,0) {
			bool k=(val>>i)&1;
			if(ch[p][!k]) p=ch[p][!k],ans|=1<<i;
			else p=ch[p][k];
		} return make_pair(ans,siz[p]);
	}
	int MAIN() {
		FOR(i,1,n) insert(a[i]);
		pair<int,ll> ans=make_pair(-1,0);
		FOR(i,1,n) {
			pair<int,ll> tmp=query(a[i]);
			if(!tmp.first) tmp.second--;
			if(tmp.first>ans.first) ans=tmp;
			else if(tmp.first==ans.first)
				ans.second+=tmp.second;
		}
		cout<<ans.first<<" "<<ans.second/2<<"\n";
		return 0;
	}
}
namespace sub3 {
	ll f[1<<23];
	void FMT(int n,int flag) {
		FOR(i,0,n-1) FOR(j,0,(1<<n)-1)
			if(!((j>>i)&1)) f[j|1<<i]+=flag==1?f[j]:-f[j];
	}
	int MAIN() {
		FOR(i,1,n) f[a[i]]++;
		FMT(23,1);
		FOR(i,0,(1<<23)-1) f[i]*=f[i];
		FMT(23,-1);
		FOR(i,1,n) f[a[i]]--;
		ROF(i,(1<<23)-1,0)
			if(f[i]) return cout<<i<<" "<<f[i]/2<<"\n",0;
		return 0;
	}
}
int main() {
	n=read(),m=read();
	FOR(i,1,n) a[i]=read();
	if(m==1) return sub1::MAIN();
	if(m==2) return sub2::MAIN();
	if(m==3) return sub3::MAIN();	
	return 0;
}
posted @ 2019-10-23 06:42  ComplexPug  阅读(34)  评论(0编辑  收藏  举报