fireworks (modulo combined number)

Problem Description

Hmz likes to play fireworks, especially when they are put regularly.
Now he puts some fireworks in a line. This time he put a trigger on each firework. With that trigger, each firework will explode and split into two parts per second, which means if a firework is currently in position x, then in next second one part will be in position x−1 and one in x+1. They can continue spliting without limits, as Hmz likes.
Now there are n fireworks on the number axis. Hmz wants to know after T seconds, how many fireworks are there in position w?

Input

Input contains multiple test cases.
For each test case:

  • The first line contains 3 integers n,T,w(n,T,|w|≤10^5)
  • In next n lines, each line contains two integers xi and ci, indicating there are ci fireworks in position xi at the beginning(ci,|xi|≤10^5).

Output

For each test case, you should output the answer MOD 1000000007.

Sample Input

1 2 0
2 2
2 2 2
0 3
1 2

Sample Output

2
3


#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;

const int maxn=1e5+10;
const int mod=1e9+7;

struct Node{
    ll pos,val;
    bool operator<(const Node& b)const{
        return pos<b.pos;
    }
}p[maxn];

ll c[maxn];


ll NY(ll base,int n){
    ll ans=1;
    while(n){
        if(n&1)
            ans=(ans*base)%mod;
        base=(base*base)%mod;
        n/=2;
    }
    return ans;
}

void get_ans(int t){
    c[0]=1;
    for(int i=1;i<=t;i++){
        c[i]=(c[i-1]*(t-i+1)%mod*NY((ll)i,mod-2))%mod;
    }
}

ll solve(ll t,int id,ll dif){
    ll m=(t-dif)/2;
    return (c[m]*p[id].val)%mod;
}

int is_ok(int a,int b){
    if(a%2==0&&b%2!=0)return 1;
    if(a%2!=0&&b%2==0)return 1;
    return  0;
}

intmain()
{
    int n,t,w;
    while(scanf("%d %d %d",&n,&t,&w)==3){
        for(int i=0;i<n;i++){
            scanf("%lld %lld",&p[i].pos,&p[i].val);
        }
        get_ans(t);
        sort(p,p+n);
        ll ans=0;
        for(int i=0;i<n;i++){
            int tmp=abs(p[i].pos-w);
            if(tmp>t||is_ok(tmp,t))continue;
            ans=(ans+solve((ll)t,i,(ll)tmp))%mod;
        }
        printf("%lld\n",ans);
    }
	return 0;
}


/***************************************************
User name: o
Result: Accepted
Take time: 488ms
Take Memory: 2300KB
Submit time: 2018-05-04 18:55:16
****************************************************/
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;

const int maxn=1e5+10;
const int mod=1e9+7;

struct Node{
    ll pos,val;
    bool operator<(const Node& b)const{
        return pos<b.pos;
    }
}p[maxn];

ll f[maxn];

void init(){
    f[1]=f[0]=1;
    for(int i=2;i<maxn;i++){
        f[i]=(f[i-1]*i)%mod;
    }
}

ll get_niyuan(ll base,int n){
    ll ans=1;
    while(n){
        if(n&1){
            ans=(ans*base)%mod;
        }
        base=(base*base)%mod;
        n/=2;
    }
    return ans;
}

ll C(ll n,ll k){
    ll ans=(f[k]*f[n-k])%mod;
     ans = get_niyuan (ans, mod-2);
     return (ans*f[n])%mod;
}

ll Lucas(int n,int m){
    return m==0?1:(C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod;
}

ll solve(ll t,int id,ll dif){
    ll m=(t-dif)/2;
    return (Lucas(t,m)*p[id].val)%mod;
}

int is_ok(int a,int b){
    if(a%2==0&&b%2!=0)return 1;
    if(a%2!=0&&b%2==0)return 1;
    return  0;
}

intmain()
{
    int n,t,w;
    init();
    while(scanf("%d %d %d",&n,&t,&w)==3){
        for(int i=0;i<n;i++){
            scanf("%lld %lld",&p[i].pos,&p[i].val);
        }
        ll ans=0;
        for(int i=0;i<n;i++){
            int tmp=abs(p[i].pos-w);
            if(tmp>t||(is_ok(tmp,t)))continue;
            ans=(ans+solve((ll)t,i,(ll)tmp))%mod;
        }
        printf("%lld\n",ans);
    }
	return 0;
}


/***************************************************
User name: o
Result: Accepted
Take time: 392ms
Take Memory: 2444KB
Submit time: 2018-05-04 15:41:29
****************************************************/


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325823160&siteId=291194637