Fireworks(山东省第8届ACM省赛)逆元,组合数
2017-07-24 14:54
417 查看
fireworks
Time Limit: 1000MS Memory Limit: 65536KBSubmit Statistic Discuss
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.
Example Input
1 2 0 2 2 2 2 2 0 3 1 2
Example Output
3
2
这题的大概意思就是定义一种能无限炸裂的烟花,每秒钟烟花炸裂后原位置什么都不会剩下,而和他相邻的两个位置会出现两个子烟花,然后让你求t秒后位置w的烟花个数。题目又给定了n组烟花,所以要求的是n组烟花在位置w的子烟花个数。
仔细观察会发现,烟花分裂的规律符合杨辉三角(去掉所有为0的点),求组合数,由于组合数太大,所以用逆元来代替除法取模。本题使用快速幂跟费马小定理求逆元。
#include #include using namespace std; typedef long long ll; const int maxn = 1299709 + 10; const int maxt = 100200; const int inf = 0x3f3f3f3f; const ll INF = 0x7f7f7f7f7f7f7f7f; const int mod = 1e9 + 7; const double pi = acos(-1.0); const double eps = 1e-8; int a[maxn]; ll C[maxn]; ll quick_mod(ll x, int n){ ll ret = 1; while(n){ if(n & 1) ret = ret * x % mod; x = x * x %mod; n >>= 1; } return ret; } void init(int t){ C[0] = 1; for(int i = 1; i <= t; ++i){ C[i] = C[i - 1] * (t - i + 1) % mod * quick_mod(i, mod - 2) % mod; } } ll solve(ll x, int w, int l){ int d = abs(x - w); ll sum = 0; if(l & 1){ if(d < l && d % 2 == 0) sum += C[l / 2 - d a67e / 2]; } else{ if(d < l && d & 1) sum += C[l / 2 + (d - 1) / 2]; } return sum; } int main(){ int n, t, w; while(scanf("%d%d%d", &n, &t, &w) == 3){ ll ans = 0; init(t); for(int i = 0; i < n; ++i){ int x, c; scanf("%d%d", &x, &c); ans += c * solve(x, w, t + 1); ans %= mod; } printf("%lld\n", ans); } }
相关文章推荐
- fireworks 2017年山东省ACM省赛C题 SDUT 3895 (逆元求组合数)
- 2017年山东省第八届ACM大学生程序设计竞赛 C fireworks(sdut 3895) 逆元求组合数
- 山东省第八届 ACM 省赛 fireworks (组合数+逆元)
- 2017山东省第八届ACM省赛 fireworks(杨辉三角 + 逆元)
- HEX----组合数+逆元+思维 山东省第八届省赛D题
- 山东省第八届acm省赛C题 fireworks
- 第八届山东省赛 C sdut 3895 fireworks(组合数+逆元)
- SDUT 3895 (山东省第八届ACM省赛C题) fireworks 杨辉三角+乘法逆元
- hatuoj 1300 HEX----组合数+逆元+思维 山东省第八届省赛D题
- 2015山东省第六届ACM省赛 Nias and Tug-of-War
- 2013山东省第四届ACM省赛 Mountain Subsequences
- 2016山东省第七届acm省赛 G题Triple Nim
- sdut2165 Crack Mathmen (山东省第二届ACM省赛)
- 山东省第二届ACM省赛 Identifiers
- 2015山东省第六届ACM省赛 Lowest Unique Price
- 山东省第一届ACM省赛 C SDUT 2153 Clockwise
- 2013山东省第四届ACM省赛 Alice and Bob
- 2013山东省第三届ACM省赛 Pick apples
- 山东省第八届ACM省赛 K 题 CF 解答(未完,待续)
- 山东省ACM第一届省赛 Hello world