转载:牛客练习赛17 c 规律题

转载:https://www.cnblogs.com/zzqc/p/8995135.html

C.
链接:https://www.nowcoder.com/acm/contest/109/C
来源:牛客网

题目描述

给定长度为n的数组a,定义一次操作为:
1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007;
2. 执行a = s;
现在问k次操作以后a长什么样。

输入描述:

第一行两个整数n,k(1 <= n <= 2000, 0 <= k <= 1,000,000,000);第二行n个整数表示a数组(0 <= a

i

<= 1,000,000,000)。

输出描述:

一行n个整数表示答案。

示例1

输入

3 1
1 2 3

输出

1 3 6

示例2

输入

5 0
3 14 15 92 6

输出

3 14 15 92 6

    首先注意到这个操作可以用矩阵来表示,设原数组为一个行向量A,k次操作之后得到的行向量B, 转移矩阵为X,则有A*X

k

=B ,观察发现X是一个N*N的上三角矩阵,

  可即使使用了快速幂,这个矩阵一次乘法的时间复杂度也不允许接受,因为N<=2000,N^3过于庞大,枚举了这个矩阵的前几次方之后发现一个规律,这个矩阵只要知道第一行的元素就可以推出这个全部的矩阵,每一列都来自于第一行的一个子段,再观察发现这些数字都是杨辉三角里的数,准确的说这一行数对应杨辉三角的一列(斜着),对于X^k,这个矩阵,第一行的元素就是( C(k-1,0) , C(k,1) , C(k+1,2),.....C(k+n-2,n-1)),组合数的公式C(n,r)=C(n,r-1)*(n-r+1)/r,C(n,r)=C(n-1,r)+C(n-1,r-1),联立得出C(n,r)=C(n-1,r-1)*n/r,有除法记得取逆元。  

 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 #include<cstdio>
 5 #include<stack>
 6 #include<set>
 7 #include<map>
 8 #include<cmath>
 9 #include<ctime>
10 #include<time.h>
11 #include<algorithm>
12 using namespace std;
13 #define mp make_pair
14 #define pb push_back
15 #define debug puts("debug")
16 #define LL long long
17 #define pii pair<int,int>
18 #define eps 1e-10
19 double R=6371009;
20
21 LL MOD=1e9+7;
22 LL q[2020];
23 LL a[2020];
24  void gcd(LL a,LL b,LL &d,LL &x,LL &y)
25   {
26       if(!b) {d=a;x=1;y=0;}
27       else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
28   }
29  LL inv(LL a,LL n)
30  {
31    LL d,x,y;
32    gcd(a,n,d,x,y);
33    return d==1?(x+n)%n:-1;
34  }
35 int main()
36 {
37     LL n,m,i,j,k;
38     scanf("%lld%lld",&n,&k);
39     for(i=1;i<=n;++i) scanf("%lld",a+i);
40     k--;
41     q[1]=1;
42     for(i=2;i<=n;++i){
43         q[i]=q[i-1]*((k+i-1)%MOD)%MOD*inv(i-1,MOD);
44         q[i]%=MOD;
45     }
46     //for(i=2;i<=n;++i) q[i]+=q[i-1],q[i]%=MOD;
47     for(i=1;i<=n;++i){
48         LL tmp=0;
49         for(j=1;j<=i;++j){
50             tmp+=a[j]*q[i-j+1];
51             tmp%=MOD;
52         }
53         printf("%lld%c",tmp,i==n?‘\n‘:‘ ‘);
54     }
55     return 0;
56 }



原文地址:https://www.cnblogs.com/vainglory/p/9021579.html

时间: 2024-08-01 23:46:15

转载:牛客练习赛17 c 规律题的相关文章

牛客练习赛17 B-好位置

传送门 题意:本来惯例中文题不解释的, 但是有些人不懂这个题意, 简单的来说, 就是s1每一个的每一个字符都可以和别的字符构成一个子串 == s2.  算了还是惯例中文题意不解释吧. 题解:其实以前写nowcoder的比赛的时候,已经被nowcoder的数据给震惊过了,可是昨天发现有人交随机数过的,有人交Java套数据过的,汗,然后中午被某人催了写一下这个题目. 其实很简单,对于s1, 我们从开头匹配出最先的s2子串,并且对应的位置记录下L[i], 在从末尾开始匹配出最后的s2子串,并且记录下对

牛客练习赛17

A 长方体 题目描述 给出共享长方体一个顶点的三个面的面积,求它十二条边的边长和. 输入描述: 一行三个整数a, b, c表示面积(1 <= a, b, c <= 10000). 输出描述: 一行一个整数表示边长和. 输入例子: 1 1 1 输出例子: 12 --> 示例1 输入 1 1 1 输出 12 示例2 输入 4 6 6 输出 28 节约时间就直接暴力做了. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 i

牛客练习赛11 B trie树+拓扑判环 E 分治求平面最近点对

牛客练习赛11 B  假的字符串题意:给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们. tags:好题 对于一个字符串, 1]如有其它字符串是它的前缀,那肯定不可能.这个直接用字典树处理就可以. 2]但如果以这个字符串为最小,怎么判定其它字符串不会矛盾呢? 其实矛盾的情况详细一点说是: 比如要以  abcd 为最小, 但又有另一个字符串 aba ,这就矛盾了. 对这种情况,在跑字典树的时候,我们对有相同父亲结点的多个儿

牛客练习赛18

链接:https://www.nowcoder.com/acm/contest/110/A来源:牛客网 最大乘积 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积最大是多少?请输出答案除以2000000000000000003(共有17 个零) 的余数. 举例来说,当 S = 5 时,若干个数的和为 5

牛客练习赛1 补题记录

A 矩阵 中文题意,要找一个最大的k阶子矩阵在原矩阵中出现过两次. 需要将这个矩阵进行Hash,也就是需要二维Hash,先把每一行Hash了,再把每一列Hash了,有一点前缀的感觉. 预处理完Hash值之后,二分答案k,check过程是在$O(n ^ 2)$枚举起点,这里其实枚举终点方便一些,边界比较好处理,把每个k阶矩阵的hash值存下来,最后看有没有两个一样的. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int

牛客练习赛10

A旅游观光 题目描述 有n个地方,编号为1->n,任意两个地方有公交车,从i到j的票价为(i+j)mod(n+1),而且这个票可以用无限次,你要把这些地方全部走一遍,问最小花费为多少.可以在任意地方开始和结束. 输入描述: 第一行一个数n 输出描述: 输出一行一个数表示答案 示例1 输入 10 输出 4 说明 1 -> 10 -> 2 -> 9 -> 3 -> 8 -> 4 -> 7 -> 5 -> 6,代价是4 备注: 对于100%的数据,有1

牛客练习赛 16

在各位ak的大佬中,我感觉我寄几好菜啊... 题目描述 给定字符串s,s只包含小写字母,请求出字典序最大的子序列. 子序列:https://en.wikipedia.org/wiki/Subsequence 字典序:https://en.wikipedia.org/wiki/Lexicographical_order 输入描述: 一行一个字符串s (1 <= |s| <= 100,000). 输出描述: 字典序最大的子序列. 示例1 输入 ababba 输出 bbba 示例2 输入 abbcb

牛客练习赛16

A   字典序最大的子序列 > 25960019 一开始潜意识看成了循环,最长子串-- 找每个字母最晚出现的位置,那么比它小的字符必须出现在 在它之后的位置 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cmath> 5 #include <set> 6 #include <map> 7 #include <list>

牛客练习赛6

A题: 方法一:一元二次方程求解,但是会有精度误差,+1个点特判一下. #include <bits/stdc++.h> using namespace std; typedef unsigned long long ll; ll t; ll x,y,z; int main() { //freopen("in.txt","r",stdin); ll n; scanf("%lld%lld",&n,&t); ll ans