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;
}