816D.Karen and Test 杨辉三角 规律 组合

LINK

题意:给出n个数,每个数对间进行加或减,结果作为下一层的数,问最后的值为多少

思路:首先我们发现很像杨辉三角,然后考虑如何计算每个数对结果的贡献值,找规律可以发现当数的个数为偶数时,其所在层表达式即为二项式定理,且其中的数下标差都为2,故倒数第二层就是将第一层的数分为系数相同的两组,最后相减或相加。注意取模问题,使用逆元。注意n<=2的特殊情况

/** @Date    : 2017-07-01 13:43:26
  * @FileName: 816D 组合 杨辉三角.cpp
  * @Platform: Windows
  * @Author  : Lweleth ([email protected])
  * @Link    : https://github.com/
  * @Version : $Id$
  */
#include <bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 2e5+20;
const double eps = 1e-8;
const LL mod = 1e9 + 7;

int n;
LL a[N];
LL fac[N], Inv[N];
LL fpow(LL a, int n)
{
	LL res = 1;
	while(n > 0)
	{
		if(n & 1)
			res = res * a % mod;
		a = a * a % mod;
		n >>= 1;
	}
	return res;
}
void init()
{
	fac[1] = Inv[1] = 1;
	for(LL i = 2; i <= n; i++)
	{
		fac[i] = fac[i - 1] * i % mod;
		Inv[i] = (mod - mod / i) * Inv[mod % i] % mod;
	}
	for(int i = 2; i <= n; i++)
	{
		Inv[i] = (Inv[i] * Inv[i - 1]) % mod;
	}
}

LL C(LL n, LL k)
{
	if(k == 0 || n == k)
		return 1LL;
	else return (fac[n] * Inv[k] % mod) * Inv[n - k] % mod;
}

int main()
{
	while(cin >> n)
	{
		init();
		MMF(a);
		LL ans = 0;
		for(int i = 0; i < n; i++) scanf("%lld", a + i);

		if(n % 2)
		{
			n--;
			LL f = 1;
			for(int i = 0; i < n; i++)
			{
				a[i] = (a[i] + a[i + 1] * f) % mod;
				f *= -1;
			}
		}
		for(int i = 0; i < n; i+=2)
		{
			ans = (ans + (a[i] + a[i + 1]*(n%4?1:-1) ) * C(n/2 - 1, i/2) % mod) % mod;
			//printf("%lld~%lld\n", a[i]*C(n/2 - 1, i/2), a[i+1]*C(n/2 - 1, i/2));
		}
		if(ans < 0)
			ans = (ans + mod) % mod;
		if(n <= 2)//小于2的特殊情况
			printf("%lld\n", (a[0] + a[1]) % mod);
		else
			printf("%lld\n", ans % mod);

	}
    return 0;
}
时间: 2024-10-04 22:19:37

816D.Karen and Test 杨辉三角 规律 组合的相关文章

Codeforces 815 B Karen and Test 杨辉三角 数学

题目链接: http://codeforces.com/problemset/problem/815/B 题目描述: 给你n个数, 让你求第一个数加第二个数 + 第二个数减第一个数 + ...... + 第n-1个数加/减第n个数, 得到一个n-1的新序列再循环 + - , 数列的长度由n --> n-1 --> n-2......1, 求最后的数是多少, 答案模MOD, n < 2e5 解题思路: 找规律吧, 比赛的时候一个点儿也没有找到, 自己对数字的敏感性太差, 首先当某一行个数为

简易的杨辉三角

利用二维数组,可以更加清晰的理解杨辉三角的规律: 将二维数组看成表格形式,总结杨辉三角规律如上. 代码: #include <stdio.h> void main(){ int num[10][10]; //获取一个二维数组 int i,j;     //变量(下标) i,j .分别控制行与列 for(i=0;i<10;i++){  // 下标从 0 开始 num[i][0]=1;   //第一列的数字都为 1 num[i][i]=1;   //两变量相等时(对角线)数值为 1 } fo

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为

如何用C++打印杨辉三角

下面是杨辉三角的一部分,我们观察观察它有什么规律: 1 1      1 1     2     1 1     3     3     1 1     4     6     4     1 1     5    10    10    5    1 1     6    15    20   15    6    1 1     7     21    35   35   21   7    1 ................ 通过观察不难发现,三角的两边都是1,而且除边界外的每个数的值都

ACM中杨辉三角的多种解法

杨辉三角的多种解法 杨辉三角的相信大家很熟悉吧,但是大家能用多少中方法写出来呀,一般人都只会想到两种,递归和二项式.当用递推时,有时在解题是根本没必要需要那么多呀,而只要杨辉三角的某一行,数据小时,我们可以用二项式来计算,但是数据比较大时,二项式算也是很麻烦的,那么还有其它的方法吗?所以下面我就介绍几种计算杨辉三角的方法吧. 主要要记住第四种.... 完整版下载:http://download.csdn.net/detail/u010304217/7750997 博客版下载:http://dow

杨辉三角,二项式系数,组合数,斐波那契数列

古人就是厉害,在此%杨辉大佬,这个杨辉三角真的是好厉害啊. 杨辉三角 杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年. 排列信息: 杨辉三角有多种重要的性质. 概述: 前提:每行端点与结尾的数为1. 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从

用C语言编写杨辉三角

今天给大家带来用C语言在屏幕上输出杨辉三角 杨辉三角: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 思路:主要用到循环和数组的知识,今天就以for循环为例,给大家输出10行的杨辉三角.我们需要定义一个二维数组(a[][]),我们知道数组是从零开始的,所以第一行第一个是a[0][0],通过观察我们发现:第一列所有的数字都是1,即就是a[i][0]=1,i表示任何数字.我们还可以看出,当行数和列数相等时,该位的数字也为1,即就是a[i][i]=1,杨辉三角中间的数字规律是:从第三行开

python打印杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数. 第n行的第m个数和第n-m+1个数相等 ,为组合数性质之一. 每个数字等于上一行的左右两个数字之和.可用此性质写出整个杨辉三角.即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一.即 C(n+1,i)=C(n

python3 实现 杨辉三角

杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年 概述 前提:每行端点与结尾的数为1. 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数. 第n行的第m个数和第n-m+1个数相等 ,为组合数性质之一. 每个数字