Codeforces 815B. Karen and Test 【规律】
2017-07-14 17:10
197 查看
B. Karen and Test
time limit per test
2 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output
Karen has just arrived at school, and she has a math test today!
The test is about basic addition and subtraction. Unfortunately, the teachers were too busy writing tasks for Codeforces rounds, and had no time to make an actual test. So, they just put one question in the test that is worth all the points.
There are n integers written on a row. Karen must alternately add and subtract each pair of adjacent integers, and write down the sums
or differences on the next row. She must repeat this process on the values on the next row, and so on, until only one integer remains. The first operation should be addition.
Note that, if she ended the previous row by adding the integers, she should start the next row by subtracting, and vice versa.
The teachers will simply look at the last integer, and then if it is correct, Karen gets a perfect score, otherwise, she gets a zero for the test.
Karen has studied well for this test, but she is scared that she might make a mistake somewhere and it will cause her final answer to be wrong. If the process is followed, what number can she expect to be written on the last row?
Since this number can be quite large, output only the non-negative remainder after dividing it by 109 + 7.
Input
The first line of input contains a single integer n (1 ≤ n ≤ 200000),
the number of numbers written on the first row.
The next line contains n integers. Specifically, the i-th
one among these is ai (1 ≤ ai ≤ 109),
the i-th number on the first row.
Output
Output a single integer on a line by itself, the number on the final row after performing the process above.
Since this number can be quite large, print only the non-negative remainder after dividing it by 109 + 7.
Examples
input
output
input
output
Note
In the first test case, the numbers written on the first row are 3, 6, 9, 12 and 15.
Karen performs the operations as follows:
The non-negative remainder after dividing the final number by 109 + 7 is
still 36, so this is the correct output.
In the second test case, the numbers written on the first row are 3, 7, 5 and 2.
Karen performs the operations as follows:
The non-negative remainder after dividing the final number by 109 + 7 is 109 + 6,
so this is the correct output.
-------
令a[1..,k,...n]={0,0,0,....,1,.....,0,0,0}
暴力求解答案就能达到a[k]对答案的贡献c[k]
暴力打个表,设Y[i][j]=杨辉三角第i层第j项
不难发现
而当n为奇数时,加减一遍,得到n−1个数,而此时这n−1个数必然是首先用加法处理
也就是说n为奇数时,处理一下就变为偶数的情况了
#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int inf=0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 200000 + 5;
ll a
,c
,fact
;
void initFact(){
fact[0]=fact[1]=1;
for(int i=2;i<N;++i){
fact[i]=(i*fact[i-1])%MOD;
}
}
ll ny(ll x){
int n=MOD-2;
ll ans=1,t=x;
while(n){
if(n&1){
ans=(ans*t)%MOD;
}
n>>=1;
t=(t*t)%MOD;
}
return ans;
}
ll C(ll n,ll k){
ll fz=fact
;
ll fm=(fact[n-k]*fact[k])%MOD;
fm=ny(fm);
return (fz*fm)%MOD;
}
int slove(int n){
int tn=n/2;
int idx=0;
for(int i=0;i<tn;++i){
c[idx++]=C(tn-1,i);
if(tn&1){
c[idx]=c[idx-1];
}
else{
c[idx]=-c[idx-1];
}
++idx;
}
ll ans=0;
for(int i=0;i<n;++i){
ans=(ans+c[i]*a[i])%MOD;
}
return (ans+MOD)%MOD;
}
int main()
{
//freopen("/home/lu/code/r.txt","r",stdin);
int n;
initFact();
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%lld",a+i);
}
if(n==1){
printf("%lld\n",a[0]);
continue;
}
if(n&1){
int flag=1;
for(int i=0;i<n-1;++i){
a[i]=a[i]+flag*a[i+1];
flag*=-1;
}
--n;
}
printf("%d\n",slove(n));
}
return 0;
}
time limit per test
2 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output
Karen has just arrived at school, and she has a math test today!
The test is about basic addition and subtraction. Unfortunately, the teachers were too busy writing tasks for Codeforces rounds, and had no time to make an actual test. So, they just put one question in the test that is worth all the points.
There are n integers written on a row. Karen must alternately add and subtract each pair of adjacent integers, and write down the sums
or differences on the next row. She must repeat this process on the values on the next row, and so on, until only one integer remains. The first operation should be addition.
Note that, if she ended the previous row by adding the integers, she should start the next row by subtracting, and vice versa.
The teachers will simply look at the last integer, and then if it is correct, Karen gets a perfect score, otherwise, she gets a zero for the test.
Karen has studied well for this test, but she is scared that she might make a mistake somewhere and it will cause her final answer to be wrong. If the process is followed, what number can she expect to be written on the last row?
Since this number can be quite large, output only the non-negative remainder after dividing it by 109 + 7.
Input
The first line of input contains a single integer n (1 ≤ n ≤ 200000),
the number of numbers written on the first row.
The next line contains n integers. Specifically, the i-th
one among these is ai (1 ≤ ai ≤ 109),
the i-th number on the first row.
Output
Output a single integer on a line by itself, the number on the final row after performing the process above.
Since this number can be quite large, print only the non-negative remainder after dividing it by 109 + 7.
Examples
input
5 3 6 9 12 15
output
36
input
4 3 7 5 2
output
1000000006
Note
In the first test case, the numbers written on the first row are 3, 6, 9, 12 and 15.
Karen performs the operations as follows:
The non-negative remainder after dividing the final number by 109 + 7 is
still 36, so this is the correct output.
In the second test case, the numbers written on the first row are 3, 7, 5 and 2.
Karen performs the operations as follows:
The non-negative remainder after dividing the final number by 109 + 7 is 109 + 6,
so this is the correct output.
-------
令a[1..,k,...n]={0,0,0,....,1,.....,0,0,0}
暴力求解答案就能达到a[k]对答案的贡献c[k]
暴力打个表,设Y[i][j]=杨辉三角第i层第j项
不难发现
当n为偶数时: n/2为奇数时: c[2*k+1]=c[2*k+2]=Y[n/2][k] n/2为偶数时: c[2*k+1]=Y[n/2][k] c[2*k+2]=-Y[n/2][k]
而当n为奇数时,加减一遍,得到n−1个数,而此时这n−1个数必然是首先用加法处理
也就是说n为奇数时,处理一下就变为偶数的情况了
#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int inf=0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 200000 + 5;
ll a
,c
,fact
;
void initFact(){
fact[0]=fact[1]=1;
for(int i=2;i<N;++i){
fact[i]=(i*fact[i-1])%MOD;
}
}
ll ny(ll x){
int n=MOD-2;
ll ans=1,t=x;
while(n){
if(n&1){
ans=(ans*t)%MOD;
}
n>>=1;
t=(t*t)%MOD;
}
return ans;
}
ll C(ll n,ll k){
ll fz=fact
;
ll fm=(fact[n-k]*fact[k])%MOD;
fm=ny(fm);
return (fz*fm)%MOD;
}
int slove(int n){
int tn=n/2;
int idx=0;
for(int i=0;i<tn;++i){
c[idx++]=C(tn-1,i);
if(tn&1){
c[idx]=c[idx-1];
}
else{
c[idx]=-c[idx-1];
}
++idx;
}
ll ans=0;
for(int i=0;i<n;++i){
ans=(ans+c[i]*a[i])%MOD;
}
return (ans+MOD)%MOD;
}
int main()
{
//freopen("/home/lu/code/r.txt","r",stdin);
int n;
initFact();
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%lld",a+i);
}
if(n==1){
printf("%lld\n",a[0]);
continue;
}
if(n&1){
int flag=1;
for(int i=0;i<n-1;++i){
a[i]=a[i]+flag*a[i+1];
flag*=-1;
}
--n;
}
printf("%d\n",slove(n));
}
return 0;
}
相关文章推荐
- 【CodeForces】669A - Little Artem and Presents(找规律)
- CodeForces - 633B A Trivial Problem(找规律)
- CodeForces - 376C Divisible by Seven(数论:同余定理)(找规律)
- Codeforce Flea CodeForces - 32C 规律|思维
- Codeforces 480B Long Jumps 规律题
- CodeForces 716C Plus and Square Root(规律)
- Codeforces 949B A Leapfrog in the Array(数学,规律)
- CodeForces - 668B Little Artem and Dance(规律题)
- CodeForces 550E Brackets in Implications 也是找找规律差不多...
- Codeforces 516A Drazil and Factorial【暴搜找规律+贪心】
- CodeForces 294B Shaass and Bookshelf 【规律 & 模拟】或【Dp】
- CodeForces-630 E. A rectangle【规律】
- 【数学相关、规律】Codeforces 696B Puzzles
- CodeForces - 202C Clear Symmetry (预处理模拟+找规律)
- 【Codeforces 735 D Taxes】 + 规律
- codeforces 24C 找规律
- CodeForces 261C Maxim and Matrix [规律题]
- CodeForces - 633B A Trivial Problem(找规律)
- CodeForces - 376C Divisible by Seven(数论:同余定理)(找规律)
- Codeforces 791 B Bear and Friendship Condition 规律