hihoCoder 1430 : A Boring Problem(一琐繁题)
hihoCoder #1430 : A Boring Problem(一琐繁题)
Description - 题目描述
As a student of the school of electronics engineering and computer science in Peking University, Kyle took the course named Advanced Algebra in his freshman year, which, unluckily, became his nightmare.
His teacher, Mr. X, has an approximately paranoid requirements in the ability of calculation, from which his students suffer a lot.
One day, Mr. X got a whim that he wanted to know for a given integer k and a long numeric string S whose length is N, what is the result of
for each i(1 ≤ i ≤ N), where
. S[L] means the Lth digit in S, and L starts from 1.
Mr. X added the problem to the midterm test. Please give a hand to Kyle and tell him the answer mod 1000000007.
作为北大信息科学技术学院的学生,Kyle曾经不知何为噩梦直到大一时候上了一门叫高等代数的课。
他的老师,Mr. X,对计算能力有着丧心病狂的要求。学生们饱受其害。
一天,Mr. X突发奇想,一个整数k与一个长度为N的数字串S,对于每个i( ≤ i ≤ N) 式子Σi j=1F(j, i)的结果是什么?这里F(j, i)=(Σi L=j S[L])^k。S[L]表示S的第L个数,L从1开始。
Mr. X把这道题放到了期中考试里。快帮帮Kyle 并告诉他模1000000007后的答案。
CN
Input - 输入
There are multiple test cases.
The first line of the input contains an integer T which means the number of test cases.
The first line of each test case contains two integers, above mentioned N and k.
The next line is the above mentioned string S. S consists of only digits('0 - '9').
多组测试用例。
输入的第一行为一个整数T,表示测试用例的数量。
每组测试用例的第一行有两个整数,即上述的N与K。
下一行为一个数字串S。S仅包含数字('0 - '')。
CN
Output - 输出
For each test case, print a single line representing the result of
for each i(1 ≤ i ≤ N).
对于每个测试用例,输出一行数字表示每个i( ≤ i ≤ N)在式子Σi j=1F(j, i)中的结果。
CN
Sample Input - 样例输入
2
5 1
12345
5 1
54321
Sample Output - 样例输出
1 5 14 30 55
5 13 22 30 35
Note - 注意
T ≤ 5
N ≤ 50,000, k ≤ 100
题解
为了防止和后面的说明混淆,字符串中的S[l]用ai代替
先按题目意思弄出几项,长得有点像01背包。

这个时候如果按上面的形式做的话,时间复杂度就是O(N*N*Log2K),会爆炸的。
如果用
看,中间的子串就不好表示……而且似乎没法化简(反正本渣没化简出来)。
然后加法不行,用减法?
使用前N项和(前缀和)就能把每个子串用减法表示出来。
此处Si表示前i项和,且S0 = 0。
式子转变如下:

再把每一项改写成二项展开式:

合并二项展开式

用SSi表示前i项S之和,则可以得到通项:

这个时候时间复杂度就降到O(NK)了。
注意取模与最后输出,然后就没什么问题了。
代码 C++
#include <cstdio>
#define mod 1000000007
#define mx 50005
#define ll long long
ll c[][], s[mx][], ss[mx][];
char rd[mx];
int main(){
int t, n, k, i, j;
ll opt, tmp;
for (i = ; i <= ; ++i){
c[i][] = ;
for (j = ; j <= i; ++j) c[i][j] = (c[i - ][j - ] + c[i - ][j]) % mod;
}
for (i = ; i < mx; ++i) s[i][] = ss[i][] = ; for (scanf("%d", &t); t; --t){
scanf("%d%d ", &n, &k); gets(rd);
for (i = ; i < n; ++i) s[i + ][] = rd[i] - '';
for (i = ; i <= n; ++i){
s[i][] = (s[i][] + s[i - ][]) % mod;
for (j = ; j <= k; ++j) s[i][j] = (s[i][j - ] * s[i][]) % mod;
}
for (i = ; i <= n; ++i){
for (j = ; j <= k; ++j) ss[i][j] = (s[i][j] + ss[i - ][j]) % mod;
} for (i = ; i <= n; ++i){
opt = ;
for (j = ; j <= k; ++j){
tmp = (c[k][j] * s[i][j]) % mod;
if ((k - j) & ) opt -= (tmp*ss[i - ][k - j]) % mod;
else opt += (tmp*ss[i - ][k - j]) % mod;
opt %= mod;
}
printf("%lld%c", (opt + mod) % mod, " \n"[i == n]);
}
}
return ;
}
hihoCoder 1430 : A Boring Problem(一琐繁题)的更多相关文章
- A Boring Problem UVALive - 7676 (二项式定理+前缀和)
题目链接: I - A Boring Problem UVALive - 7676 题目大意:就是求给定的式子. 学习的网址:https://blog.csdn.net/weixin_37517391 ...
- HDU 5832 A water problem(某水题)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】
CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...
- A Boring Problem UVALive - 7676
16年北京现场赛的题,全场过的队30+. 初看只知道 O(N^2logK)的暴力,以为是什么变换. 仔细发现活用 二项式定理 就行. #include <bits/stdc++.h> us ...
- 【XSY1642】Another Boring Problem 树上莫队
题目大意 给你一棵\(n\)个点的树,每个点有一个颜色\(c_i\),每次给你\(x,y,k\),求从\(x\)到\(y\)的路径上出现次数第\(k\)多的颜色的出现次数 \(n,q\leq 1000 ...
- 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分
转载自https://blog.csdn.net/weixin_37517391/article/details/83821752 题解 其实这题不难,只要想到了前缀和差分就基本OK了. 我们要求的是 ...
- hdu 3518 Boring counting 后缀数组基础题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- Train Problem I (HDU 100题纪念)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- hdu 5427 A problem of sorting 水题
A problem of sorting Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contest ...
随机推荐
- iOS,信息加解密
1.AES加解密 AES加解密 // // AESEncryptAndDecrypt.h // NSData扩展方法,用于处理aes加解密 // // Created by Vie on 16/ ...
- FusionChart 数据的传入方式
已有案例,懒得写了,放个链接,大家看看吧.http://www.cnblogs.com/liujian21st/archive/2013/03/22/2975124.html
- Eclipse 恢复删除的文件
这件事发生在,两周以前,那时我正在写LLT,补充完代码覆盖率.突然,我的代码呢,我的代码去哪里了?由于对Eclipse还不太熟悉,代码就则样被我从磁盘删掉了.然后火速给同事打电话,同事说如果删除了,而 ...
- .net之工作流工程展示及代码分享(一)工作流表单
Workflow表单的作用是能够在客户端进行表单设计,然后在流程中动态开放哪些输入框可以供用户填写. 在这里我扩展了一个常用的WebEditor工具——KindEditor,能够插入自定义的html符 ...
- [原创]Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析
主入口为com.android.settings.Settings. 这只是一个wrapper的类, 它继承于 SettingsActivity类,并且声明了一堆公有的继承于SettingsActiv ...
- php生成随机密码的几种方法
方法一: 1.在 33 – 126 中生成一个随机整数,如 35,2.将 35 转换成对应的ASCII码字符,如 35 对应 #3.重复以上 1.2 步骤 n 次,连接成 n 位的密码 该算法主要用到 ...
- AngularJs自定义指令--执行顺序 (原文:http://www.cnblogs.com/sagacite/p/4624227.html)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Google-glog 日志库使用手记
作者:高张远瞩(HiLoveS) 博客:http://www.cnblogs.com/hiloves/ 转载请保留该信息 Google Glog 是一个C++语言的应用级日志记录框架,提供了 C++ ...
- Intellij Idea 14 使用jetty-maven-plugin配置运行web工程
在项目中接触,虽然比较简单,也是经验的积累,web工程使用maven管理和构建,IDEA也是新接触的开发工具,用了一段时间,感觉so nice! 1:Run->Edit Configuratio ...
- [转载] 不查资料确定int型整数的最大值和最小值
原文地址:http://blog.csdn.net/zhanghuoding/article/details/42719213 想法来自于书中的习题. Java的话直接输出 Integer.MAX_V ...