hihoCoder #1430 : A Boring Problem(一琐繁题)

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

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(一琐繁题)的更多相关文章

  1. A Boring Problem UVALive - 7676 (二项式定理+前缀和)

    题目链接: I - A Boring Problem UVALive - 7676 题目大意:就是求给定的式子. 学习的网址:https://blog.csdn.net/weixin_37517391 ...

  2. HDU 5832 A water problem(某水题)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  3. CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】

    CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...

  4. A Boring Problem UVALive - 7676

    16年北京现场赛的题,全场过的队30+. 初看只知道 O(N^2logK)的暴力,以为是什么变换. 仔细发现活用 二项式定理 就行. #include <bits/stdc++.h> us ...

  5. 【XSY1642】Another Boring Problem 树上莫队

    题目大意 给你一棵\(n\)个点的树,每个点有一个颜色\(c_i\),每次给你\(x,y,k\),求从\(x\)到\(y\)的路径上出现次数第\(k\)多的颜色的出现次数 \(n,q\leq 1000 ...

  6. 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分

    转载自https://blog.csdn.net/weixin_37517391/article/details/83821752 题解 其实这题不难,只要想到了前缀和差分就基本OK了. 我们要求的是 ...

  7. hdu 3518 Boring counting 后缀数组基础题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  8. Train Problem I (HDU 100题纪念)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  9. hdu 5427 A problem of sorting 水题

    A problem of sorting Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contest ...

随机推荐

  1. 网页3D引擎“Babylon.JS”入门教程翻译总结

    使用三个月的业余时间把官方教程的入门部分译为中文并上传到github,在下一步编程前做一个总结. 历程: 最早接触游戏编程是在大三下学期,用汇编语言和实验室里的单片机.触摸屏.电机(提供声效)编的打地 ...

  2. LoadRunner连接Genymotion

  3. sed处理文本文件

    SQL文件处理在以select 开通的行的上一行添加 explain analyze 并写入文本(-i)sed -i '/^select/i\explain analyze' test_load2.l ...

  4. EaeyUI

    基础 定义 一个轻量级的JavaScript框架 基本用法 $(function(){代码}) 相当于window.load()(当窗口加载完毕后触发) 选择器是jQuery的根基 通过选择器选中元素 ...

  5. jQuery Scroll Follow

    Overview Scroll Follow is a simple jQuery plugin that enables a DOM object to follow the page as the ...

  6. HTML5&CSS3练习笔记(一)

    属性选择器的用法 格式:[属性/^/*/$=值] 1.[attr=val] 匹配指定值的元素 <div> <div id="section1"> 完全匹配元 ...

  7. GUI生成exe文件

    gui如何生成exe文件: 已经有gui.m和gui.fig文件 1 安装编译器.已经安装好了vs10的. 2 设置编译器.在matlab命令行输入mex -setup,选择安装的c编译器 3 调用编 ...

  8. Node.js中的Session,不要觉得简单哦。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...

  9. Oracle 12c In Memory Option初探

    前情提要: Oracle OpenWorld 2013中Larry Ellison爆料的Oracle新特性:Oracle In Memory Database Option 1. 这个新特性将随着12 ...

  10. 关于oracle中in和exists的区别

    一般来说,这两个是用来做两张(或更多)表联合查询用的,in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,假设有A.B两个表,使用时是这样的: 1.select * from ...