Codeforces Round #419 B. Karen and Test (思维 + 组合数 + 乘法逆元)
2017-06-20 10:30
423 查看
题意
对于给定的 N 个数,呈倒三角形的形式逐层产生 N-1, N-2, … 1 个数。其产生方式逐层且每层从左到右,对于第 i 个产生的元素,若 i 为第奇数个,则其为上一层两个数之和,反之为差。求最后一层的元素? 其中所有元素均对1e9 + 7取模
解题思路
谜一样的解题思路。借用官方题解的图来看:
![](http://codeforces.com/predownloaded/eb/bf/ebbf3b5ba52e7a0ab7b25c92b9cb756737e6bd50.png)
当 N 为偶数的时候,即初始为偶数个元素时,观察蓝色部分可知将元素按奇偶分类,其仍满足组合数的系数项。如 a1,a3,a5 ,对于 a1+2×a3+a5 ,其系数项分别为 C02 , C12 , C22 。
同时,考虑其对最终答案的贡献,可以看到当 N 为 6 的时候,倒数第二层的两项相加为最后答案;但是,当 N 为 4 的时候,(观察前四个元素所组成的倒三角形),倒数第二层的 a1+a3 与 a2+a4 之差形成最终结果。故应将其按照 N≡0(mod4) 和 N≡2(mod4) 分开处理。
对于 N≡1(mod4) 和 N≡3(mod4) ,只需要想处理第一层,将产生的第二次视作输入即可。
对于组合数的处理,可以考虑结合乘法逆元。
代码
#include<bits/stdc++.h> using namespace std; const int N = 200000 + 10; const int mod = 1e9 + 7; int n, a , deal ; long long fac = {1, 1}, inv = {0, 1}, f = {1, 1}; void init() { for(int i=2;i<N;i++) { fac[i] = fac[i-1] * i % mod; f[i] = (mod - mod/i) * f[mod%i] % mod; inv[i] = inv[i-1] * f[i] % mod; } } long long C(long long n, long long i) { if(i == 0 || i == n) return 1; return fac * inv[n-i] % mod * inv[i] % mod; } int main() { init(); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); if(n <= 2) { printf("%d\n", (a[1] + a[2]) % mod); return 0; } if(n % 2) { for(int i=2;i<=n;i++) (deal[i-1] = a[i-1] + (i%2?-1:1) * a[i]) %= mod; n--; } else { for(int i=1;i<=n;i++) deal[i] = a[i]; } long long ans = 0, tmpC; int ope = (n%4 == 0 ? -1 : 1); for(int i=1;i<=n;i+=2) { tmpC = C(n/2-1, i/2); (ans += tmpC * (deal[i] + ope * deal[i+1]) % mod) %= mod; } ans = (ans % mod + mod) % mod; printf("%d\n", ans % mod); }
相关文章推荐
- Codeforces Round #419 D. Karen and Test
- Codeforces Round #419 A. Karen and Game
- codeforces round #419 B. Karen and Coffee
- Codeforces Round #419 (Div. 2) B. Karen and Coffee
- Codeforces Round #419 (Div. 2)_Karen and Coffee
- Codeforces Round #419 (Div. 2)-树形dp&依赖背包&-E. Karen and Supermarket
- Codeforces Round #419 (Div. 2) C. Karen and Game【贪心】
- Codeforces Round #419 (Div. 1) C. Karen and Supermarket(树上背包)
- codeforces round #419 E. Karen and Supermarket
- Codeforces Round #419 (Div. 2)Karen and Coffee
- Codeforces Round #419 (Div. 2) E. Karen and Supermarket(树形DP)
- [排列组合]Codeforces Round #324 (Div. 2)E - Anton and Ira
- Codeforces Round 421 Div.2 D. Mister B and PR Shifts 思维 乱搞
- Codeforces Round #421 (Div. 1):B. Mister B and PR Shifts 思维,乱搞
- 【Codeforces Round 263 (Div 2)C】【贪心 哈弗曼思维】Appleman and Toastman 每个非1size子树延展为2子树的最大权
- codeforces Karen and Coffee (区间贡献 思维)
- Codeforces Round #389(Div.2)C Santa Claus and Robot【思维】
- codeforces Karen and Coffee (区间贡献 思维)
- Codeforces Round #394(Div. 2)B. Dasha and friends【思维+暴力】
- codeforces Karen and Coffee (区间贡献 思维)