10.24 noip模拟试题

尼玛pdf依旧不会粘23333

/*
每段合并到总的里面 
假设总的有X个 这一段有Y个
一共有X+1个空 那么就有
C(X+1,1)+C(X+1,2)+C(X+1,3)+...+C(X+1,Y)
这样是WA的!!!
比如说 C(X+1,2) 那就是Y个放到两个空里
分别放几个...忘了算了23333
自己就想到这里 Wa了 10分
(暴力40 吐血了) 
*/
#include<iostream>
#include<cstdio>
#define maxn 1010
#define mod 1000000007
#define ll long long
using namespace std;
ll n,m,a[maxn],f[maxn],len[maxn],c[maxn][maxn],ans=1;
ll init(){
    ll x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
void Get_c(){
    for(int i=0;i<=n;i++)c[i][0]=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)
            c[i][j]=c[i-1][j]+c[i-1][j-1];
}
ll G(ll x,ll y){
    ll sum=0;
    for(ll i=1;i<=y;i++)
        sum+=c[x+1][i];
    return sum;
}
int main()
{
    freopen("lantern.in","r",stdin);
    freopen("lantern.out","w",stdout);
    n=init();m=init();
    for(int i=1;i<=m;i++){
        ll x=init();f[x]=1;
    }
    Get_c();
    ll sum=0;f[n+1]=1;
    for(int i=1;i<=n+1;i++){
        if(!f[i])sum++;
        else {
            len[++len[0]]=sum;sum=0;
        }
    }
    sum=len[1];
    for(int i=2;i<=len[0];i++){
        ans=ans*G(sum,len[i]);
        ans%=mod;sum+=len[i];
    }
    for(int i=2;i<len[0];i++){
        ans=ans*(1<<len[i]-1);
        ans%=mod;
    }
    cout<<ans<<endl;
}
/*
同桌想到了更简单的方法
合并的方案数有(n-m)!/(πlen[i]!)
证明吗 我们联想 4个红球 3个黑球 5个蓝球
放在一起的方案数 (4+3+5)!/(4!*3!*5!)
就是把一样的颜色删掉 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define mod 1000000007
#define inf 1e10
#define ll long long
using namespace std;
ll n,m,a[maxn],f[maxn],ans=1,len[maxn],c[maxn],prime[maxn],num;
ll init(){
    ll x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
void Prime(){
    for(int i=2;i<=n;i++){
        if(f[i]==0)prime[++num]=i;
        for(int j=1;j<=num;j++){
            if(i*prime[j]>n)break;
            f[i*prime[j]]=1;
            if(i%prime[j]==0)break;
        }
    }
}
void J(ll x){
    for(int i=1;i<=num;i++){
        ll P=prime[i];
        while(P<=n){
            c[i]+=x/P;
            P*=prime[i];
        }
    }
}
void JJ(ll x){
    for(int i=1;i<=num;i++){
        ll P=prime[i];
        while(P<=n){
            c[i]-=x/P;
            P*=prime[i];
        }
    }
}
ll Pow(ll x,ll y){
    ll r=1;
    for(int i=1;i<=y;i++)
        r=r*x,r%=mod;
    return r;
}
int main()
{
    freopen("lantern.in","r",stdin);
    freopen("lantern.out","w",stdout);
    n=init();m=init();
    for(int i=1;i<=m;i++){
        ll x=init();f[x]=1;
    }
    ll sum=0;f[n+1]=1;
    for(int i=1;i<=n+1;i++){
        if(!f[i])sum++;
        else {
            len[++len[0]]=sum;sum=0;
        }
    }
    memset(f,0,sizeof(f));
    Prime();J(n-m);
    for(int i=1;i<=len[0];i++)
        JJ(len[i]);
    for(int i=2;i<len[0];i++){
        ans=ans*Pow(2,len[i]-1);
        ans%=mod;
    }
    for(int i=1;i<=n;i++)
        ans=ans*Pow(prime[i],c[i]),ans%=mod;
    cout<<ans<<endl;
    return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100010
#define inf 1e18
#define ll long long
using namespace std;
ll n,m,p[maxn],c[maxn],ans;
ll init(){
    ll x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
bool Judge(ll x){
    for(int j=1,i=1;i<=n;i++){
        if(p[i]-c[j]>x)return 0;
        ll R=0;
        if(c[j]<p[i])R=max(x-(p[i]-c[j])+c[j],(x+p[i]+c[j])/2);
        else R=p[i]+x;
        while(j<=m+1&&R>=c[j])j++;
        if(j>m)return 1;
    }
    return 0;
}
int main()
{
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    n=init();m=init();
    for(int i=1;i<=n;i++)p[i]=init();
    for(int i=1;i<=m;i++)c[i]=init();
    ll l=0,r=inf;
    while(l<=r){
        ll mid=l+r>>1;
        if(Judge(mid)){
            r=mid-1;ans=mid;
        }
        else l=mid+1;
    }
    cout<<ans<<endl;
    return 0;
}
/*暴力没调出来 输出了不修改的 然而没数据 过几天再改吧*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 100010
#define inf 100000000
#define ll long long
using namespace std;
ll n,m,num,head[maxn],len[maxn],C,f[maxn];
struct node{
    ll v,t,pre,o;
}e[maxn*2];
struct edge{
    ll u,v,t;
}p[maxn];
ll init(){
    ll x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
ll min(ll x,ll y){
    return x>y?x:y;
}
void Add(ll from,ll to,ll dis,ll fal){
    num++;e[num].v=to;
    e[num].t=dis;
    e[num].o=fal;
    e[num].pre=head[from];
    head[from]=num;
}
ll Dfs(ll now,ll from){
    ll s=1;f[now]=1;
    for(ll i=head[now];i;i=e[i].pre){
        ll v=e[i].v;
        if(v!=from&&i!=C)s+=Dfs(v,now);
    }
    return s;
}
ll Get(){
    ll sum=0;
    for(ll i=1;i<=m;i++){
        ll l=Dfs(p[i].u,p[i].v);
        ll r=Dfs(p[i].v,p[i].u);
        len[i]=l*r*p[i].t;sum+=len[i];
    }
    return sum;
}
ll Solve(ll u,ll v,ll x){
    C=x;memset(f,0,sizeof(f));m++;
    Add(u,v,p[x].t,n);Add(v,u,p[x].t,n);
    ll sum=Get();for(ll i=1;i<=n;i++)
        if(f[i]==0)return inf;
    num-=2;m--;return sum;
}
int main()
{
    //freopen("road.in","r",stdin);
    //freopen("road.out","w",stdout);
    n=init();ll u,v,t;m=n-1;
    for(ll i=1;i<n;i++){
        u=init();v=init();t=init();
        p[i].u=u;p[i].v=v;p[i].t=t;
        Add(u,v,t,i);Add(v,u,t,i);
    }
    ll mx=Get();
    /*for(ll i=1;i<=n;i++)
        for(ll j=i+1;j<=n;j++)
            for(ll k=1;k<=m;k++){
                mx=min(mx,Solve(i,j,k));
            }*/
    cout<<mx<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/yanlifneg/p/5993072.html