Vertex Cover + CCPC2018-湖南全国邀请赛

Alice and Bobo are playing a game on a graph with n vertices numbered with 0,1,,(n1).
The vertex numbered with i is associated with weight 2i.

The game is played as follows.
Firstly, Alice chooses a (possibly empty) subset of the n(n1)2 edges.
Subsequently Bobo chooses a (possibly empty) subset of the n vertices to *cover* the edges chosen by Alice.
An edge is *covered* if one of its two ends is chosen by Bobo.
As Bobo is smart, he will choose a subset of vertices whose sum of weights, denoted as S, is minimum.

Alice would like to know the number of subsets of edges where Bobo will choose a subset whose sum of weights is exactly k (i.e. S=k), modulo (109+7)
.
Input The input consists of several test cases and is terminated by end-of-file.

Each test case contains two integers n and k.
For convenience, the number k is given in its binary notation.
Output For each test case, print an integer which denotes the result.

## Constraint

* 1n105
* 0k<2n
* The sum of n does not exceed 250,000.
Sample Input
3 1
4 101
10 101010101
Sample Output
3
12
239344570
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;


#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)

#define all(a) (a).begin(),(a).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define f first
#define s second

ll rd(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

const int N=1e5+10;
const int mod=(int)1e9+7;

char c[N];

inline ll add(ll abc){
    if(abc>mod)abc-=mod;
    return abc;
}
ll power(ll a,ll b) {
    ll ans = 1;
    a %= mod;
    while(b) {
        if(b & 1) ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
int main(){
#ifdef happy
    freopen("in.txt","r",stdin);
#endif
    int n;
    while(~scanf("%d %s",&n,c)){
        string s(c);
        reverse(all(s));
        int len=s.size();
        vi a;
        for(int i=0;i<len;i++)
        if(s[i]=='1'){
            a.push_back(i);
        }

        reverse(all(a));

        ll ans=1;
        len=a.size();
        //n=n-1;
        for(int i=0;i<len;i++){
            ll t=power(2.0,n-a[i]-i-1)-1;
            t = (t%mod + mod)%mod;
            ans=(ans*t)%mod;
            //cout<<ans<<endl;
            t=power(2.0,i+a[i]-(len-i-1));
            ans=(ans*t)%mod;
            //cout<<ans<<endl;
        }
        cout<<ans<<endl;
        /*
        for(auto u:a){
            printf("%d ",u);
        }
        puts("");
        */
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ujn20161222/article/details/80534553