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 ...
随机推荐
- linux查看进程启动时间
1. ps axu 2. 精确查看 for pid in $(pgrep httpd); do echo -n "${pid} " ; ps -p ${pid} -o lstart ...
- 寿司点餐系统Sprint1总结
为期十天的一个冲刺,说长不长,说短不短.从一开始的接收课程任务到第一次聚集讨论. 确定方案.实行方案,再到最后的决定结束第一个冲刺,都是大家一起讨论着加小小的默契一步步 向前.没有完美,但是总体完成的 ...
- Android Animation(动画)
前言 Android 平台提供实现动画的解决方案(三种) 一.3.0以前,android支持两种动画: (1)Frame Animation:顺序播放事先做好的图像,与gif图片原理类似,是一种逐帧动 ...
- springmvc中的controller是单例的
今天发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变 ...
- gulp 外挂 rename 的使用
安装和使用就不详细说了.前面有. gulpfile.js 的配置 var gulp = require('gulp'), rename = require('gulp-rename'), // 记得先 ...
- swift基础:第一部分:基本数据类型及结构
首先谈点开心的:今天是周二,广州的天气格外明朗,早上上班的心情也不一样,最值得高兴事,很快到五一劳动节了,说到劳动节,放假是吧.你懂的.再来谈谈我上周的工作总结,上周可以说是黑轮压城城欲摧,甲光向日金 ...
- WCF学习目的
WCF,window communication Foundation,是微软推出的面向服务应用的一款产品. 近来为一个WEB app前端项目写后台接口.涉及到跨域访问,服务代理等方面的内容.项目的需 ...
- Python练习,网络小爬虫(初级)
最近还在看Python版的rcnn代码,附带练习Python编程写一个小的网络爬虫程序. 抓取网页的过程其实和读者平时使用IE浏览器浏览网页的道理是一样的.比如说你在浏览器的地址栏中输入 www ...
- markdown-js 添加表格,代码块 parse
简介 markdown-js 是将 markdown转换成 HTML 的 JavaScript 库,我再网站中使用它来预览 markdown ,但是发现它对 代码块 和 表格 是不转换的.这么鸡肋的地 ...
- Centos上搭建基于L2TP的VPN
1.一些预先准备的环境 yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced ...