【NKOJ-3823】果冻怪

时间限制 : - MS   空间限制 : 165536 KB 
评测说明 : 1000ms

问题描述

小南和小开在三友路上养了很多只果冻怪。我们可以将三友路想象成一根长度无限的数 轴,在这上面生活着n只果冻怪。每经过一秒,一只果冻怪便会分裂成两只。具体来说,一 只坐标为x的果冻怪,会分裂成两只分别在(x − 1),(x + 1)上的果冻怪,并且原来在x上的果 冻怪会消失。 由于生存空间有限,若一个位置上有不少于P只果冻怪,那么会立刻消失 P 只。经过测 定P = 10^9 + 7。 小南和小开想知道在第T秒末,位置w有多少只果冻怪。初始时刻是0秒初。 

输入格式

第一行为三个整数,n,T,w。含义如题所述。
接下来 n 行,每行两个整数𝑥𝑖,𝑐𝑖,表示𝑥𝑖位置,有𝑐𝑖只果冻怪。注意𝑥𝑖可能有重复。 

输出格式

输出一个非负整数,表示 T 秒末 w 位置上的果冻怪个数

样例输入

2 2 2 
0 3 
1 2 

样例输出

3

提示

对于 30%的数据: 1 ≤ n ≤ 100,1 ≤ T ≤ 16。
对于 60%的数据:1 ≤ n ≤ 10^5,1 ≤ T ≤ 16。
对于 100%的数据:1 ≤ n,T,𝑐𝑖 ≤ 10^5,0 ≤ |𝑤|,|𝑥𝑖| ≤ 10^5。 

 ACcode+题解:

#include<bits/stdc++.h>
#pragma GCC optimize(3,"Ofast","inline")
#define p 1000000007
#define ll long long
using namespace std;
ll n,w,t;
ll x,c,d,ans;
ll road[200005]= {1};
ll KSM(ll a,ll b) {
	ll ans=1;
	a=a%p;
	while(b) {
		if(b%2==1)ans=(a*ans%p);
		a=(a*a%p);
		b/=2;
	}
	return ans%p;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>t>>w;
	for(int i=1; i<=t; i++)road[i]=((road[i-1]*(t-i+1)%p)*KSM(i,p-2)%p);
	/*-------------------------------------------------------------------------
	  c[xn][xm]*(xm+1)/(xn-xm)=c[xn][xm+1]//Chara推得
  road[i]=((road[i-1]*(t-i+1)%p)*KSM(i,p-2)%p)
	杨辉三角
	for(int i=0;i<=t;i++)cout<<road[i]<<" ";
	cout<<endl;

推理:
 1
1 0 1
 1 0 2 0 1
1 0 3 0 3 0 1
 1 0 4 0 6 0 4 0 1
1 0 5 0 + 0 + 0 5 0 1
Tip: + 代表 10
性质1:
	杨辉三角第 t 排 {
		c[xn][xm]*(xm+1)/(xn-xm)=c[xn][xm+1]
	}
性质2:
	奇偶插空{
	(time为奇,对应杨辉上非0的奇数位,time为偶,对应杨辉上非0的偶数位){
		设 x 和 w 的距离为 d {
			time为奇,对应杨辉上d/2+t/2+1
			time为偶,对应杨辉上d/2+t/2
 		}
 	}
}
-------------------------------------------------------------------------*/
	for(int i=1; i<=n; i++) {
		cin>>x>>c;
		d=abs(w-x);
		if((t%2==1)&&(d%2==1))ans=(ans+(c*road[d/2+t/2+1]%p))%p;//找到在三角中的对应位置
		if((t%2==0)&&(d%2==0))ans=(ans+(c*road[d/2+t/2]%p))%p;//同上
	}
	cout<<ans;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值