牛客练习赛105(A-D)

A-切蛋糕的贝贝

题解:分成1:1:4:5:1:4份,每次都要沿着两点连线切割,所以n要是16的倍数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>  pll;
const ll N=5e5+5;
const ll inf=1e18;
const ll mod=9901;
ll a[N],sum[N];
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  ll n;cin>>n;
  if(n&&n%16==0) cout<<5;
  else cout<<-1;
}
 

B-抱歉,这没有集美

题解:gcd(x,y)为偶数,那么就说明x,y都是偶数。反向思考,考虑概率为0的情况,就是把所有的偶数都付给奇数点。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>  pll;
const ll N=5e5+5;
const ll inf=1e18;
const ll mod=1e9+7;
ll a[N],sum[N],fact[N],infact[N],res[N];
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  ll n;cin>>n;
  ll p=n/2;
  ll q=n-p;
  ll ans=1;
  ll sum=1;
  for(ll i=1;i<=n;i++){
    sum=(sum*i)%mod;
  }
  for(ll i=1;i<=p;i++){
    ans=(ans*i)%mod;
  } 
  if(n&1) ans=(ans*q)%mod;//在奇数点中选择p个偶数点
  for(ll i=1;i<=q;i++){
    ans=(ans*i)%mod;
  }
  ans=(sum-ans+mod)%mod;
  cout<<ans;
}

C-打牌的贝贝

题解:贝贝赢得方式必须是出一张牌大于宁宁手上所有牌,所以可以先分配给贝贝n-1张牌,然后将这剩下得n+1张牌中最大的呢张牌给贝贝,那么贝贝一定赢,然后再通过总的减去求出宁宁即可,数目很大,用逆元求组合数。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>  pll;
const ll N=2e6+10;
const ll inf=1e18;
const ll mod=1e9+7;
ll fact[N],infact[N];
ll ksm(ll x,ll y){
  ll ans=1;
  while(y){
    if(y&1) ans=(ans*x)%mod;
    x=(x*x)%mod;y>>=1;
  }
  return ans;
}
void init(){
  fact[0]=1;
  for(ll i=1;i<=2000000;i++){
    fact[i]=fact[i-1]*i%mod;
  }
  infact[2000000]=ksm(fact[2000000],mod-2)%mod;
  for(ll i=2000000;i>=1;i--){
      infact[i-1]=infact[i]*i%mod;
  }
}
ll solve(int a,int b){
  return fact[a]*infact[b]%mod*infact[a-b]%mod;
}
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  init();
  ll t;cin>>t;
  while(t--){
    int n;cin>>n;
    cout<<solve(2*n,n-1)<<" "<<(solve(2*n,n)-solve(2*n,n-1)+mod)%mod<<"\n";
  }
}

D-点分治分点

题解:将所有路径按照权值从大到小排序,然后每次将边加到图中,这样每次选出的权值,对于能达到的点而言,都一样是最小值中的最大值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>  pll;
const ll N=2e6+10;
const ll inf=1e18;
const ll mod=1e9+7;
ll n,m,s;
ll dis[N],vis[N],ans[N];
vector<ll> e[N];
struct sp{
  ll x,y,w;
}a[N];
bool cmp(sp x,sp y){
  return x.w>y.w;
}
void dfs(ll x,ll w){
  vis[x]=1;ans[x]=w;
  for(auto it:e[x]){
    if(!vis[it]){
      dfs(it,w);
    }
  }
}
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  cin>>n>>m>>s;
  for(ll i=1;i<=m;i++){
     cin>>a[i].x>>a[i].y>>a[i].w;
  }
  sort(a+1,a+1+m,cmp);
  fill(ans,ans+N,-1);
  vis[s]=1;
  for(ll i=1;i<=m;i++){
    ll x=a[i].x;
    ll y=a[i].y;
    e[x].push_back(y);
    if(vis[x]&&!vis[y]){
      dfs(y,a[i].w);
    }
  }
  for(ll i=1;i<=n;i++){
    cout<<ans[i]<<" ";
  }
}
posted @ 2022-11-06 21:18  HHzp  阅读(49)  评论(0编辑  收藏  举报