转载自https://blog.csdn.net/weixin_37517391/article/details/83821752

题解

其实这题不难,只要想到了前缀和差分就基本OK了.
我们要求的是第$i$项的式子:
$F(i)=(a_1+a_2+...+a_i)^k+(a_2+...+a_i)^k+...+a_i^k$
记$S_i = a_1 + a_2 +...+a_i,S_0=0$
$F(i) = (S_i-S_0)^k+(S_i-S_1)^k+...+(S_i-S_{i-1})^k$
二项式定理展开:
$F(i) = \sum_{t=0}^kC_k^tS_i^t(-S_0)^{k-t} +  \sum_{t=0}^kC_k^tS_i^t(-S_1)^{k-t} +...+ \sum_{t=0}^kC_k^tS_i^t(-S_{i-1})^{k-t}$
整理得:
$F(i) = \sum_{t=0}^k C_k^t S_i^t(-1)^{k-t} (S_0^{k-t}+S_1^{k-t}+...+S_{i-1}^{k-t})$
再记:
$SS[i][j] = S_0^i + S_1^i + ... + S_j^i$
那么
$F(i) = \sum_{t=0}^k C_k^t S_i^t(-1)^{k-t} (SS[k-t][i-1])$
注意到$SS$可以$O(nk)$预处理出来,$S$也可以$O(nk)$预处理出来,而$F(i)$就可以$O(k)$出来。

代码

 #include <iostream>
#include <algorithm>
#include <cstring>
#define pr(x) std::cout << #x << ':' << x << std::endl
#define rep(i,a,b) for(int i = a;i <= b;++i) typedef long long LL;
const int N = ;
const LL P = 1e9+;
int T,n,k;
char s[N];
long long S[][N],SS[][N];
long long C[][];
void init() {
C[][] = ;
for(int i = ;i <= ;++i) {
C[i][] = ;
for(int j = ;j <= i;++j) {
C[i][j] = (C[i-][j-] + C[i-][j]) % P;
}
}
}
int main() {
std::ios::sync_with_stdio(false);
init();
std::cin >> T;
while(T--) {
std::cin >> n >> k;
std::cin >> s;
for(int i = ;i <= n;++i) S[][i] = ;
for(int i = ;i <= n;++i) S[][i] = (s[i-]-'') + S[][i-] ;
for(int i = ;i <= k;++i)
for(int j = ;j <= n;++j)
S[i][j] = S[][j] * S[i-][j] % P; SS[][] = ; //特殊化处理,0^0=1 for(int i = ;i <= k;++i) {
for(int j = ;j <= n;++j)
SS[i][j] = (SS[i][j-] + S[i][j])% P;
} for(int i = ;i <= n;++i) {
long long ans = ;
for(int j = ;j <= k;++j) {
long long res = C[k][j]*S[j][i]%P*SS[k-j][i-]%P;
if((k-j)%==) ans = (ans + res) % P;
else ans = (ans - res + P) % P;
}
if(i != ) std::cout << " ";
std::cout << ans;
}
std::cout << std::endl;
}
return ;
}

北京区域赛I题,Uva7676,A Boring Problem,前缀和差分的更多相关文章

  1. Hihocoder 1634 Puzzle Game(2017 ACM-ICPC 北京区域赛 H题,枚举 + 最大子矩阵变形)

    题目链接  2017 Beijing Problem H 题意  给定一个$n * m$的矩阵,现在可以把矩阵中的任意一个数换成$p$,求替换之后最大子矩阵的最小值. 首先想一想暴力的方法,枚举矩阵中 ...

  2. HihoCoder 1629 Graph (2017 ACM-ICPC 北京区域赛 C题,回滚莫队 + 启发式合并 + 可撤销并查集)

    题目链接  2017 ACM-ICPC Beijing Regional Contest Problem C 题意  给定一个$n$个点$m$条边的无向图.现在有$q$个询问,每次询问格式为$[l, ...

  3. Heshen's Account Book HihoCoder - 1871 2018北京区域赛B题(字符串处理)

    Heshen was an official of the Qing dynasty. He made a fortune which could be comparable to a whole c ...

  4. HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~

    F - Almost Sorted Array Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  5. hdu5080:几何+polya计数(鞍山区域赛K题)

    /* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...

  6. HDU 4438 Hunters 区域赛水题

    本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数 ...

  7. 2018 ACM-ICPC 亚洲区域赛北京现场赛 I题 Palindromes

    做法:打表找规律 大数是过不了这个题的(但可以用来打表) 先找k的前缀,前缀对应边缘数字是哪个 如果第0位是2-9 对应奇数长度的1-8 第0位为1时,第1位为0时对应奇数长度的9,为1-9时对应偶数 ...

  8. HDU 5122 K.Bro Sorting(2014北京区域赛现场赛K题 模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5122 解题报告:定义一种排序算法,每一轮可以随机找一个数,把这个数与后面的比这个数小的交换,一直往后判 ...

  9. HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)

    虽然是一道还是算简单的DP,甚至不用滚动数组也能AC,数据量不算很大. 对于N个数,每个数只存在两个状态,取 和 不取. 容易得出状态转移方程: dp[i][j] = dp[i - 1][j ^ a[ ...

随机推荐

  1. Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  2. unittest参数化parameterized

    参考文章: https://www.cnblogs.com/royfans/p/7226360.html https://blog.csdn.net/zha6476003/article/detail ...

  3. Eclipse安装配置Maven

    Eclipse安装配置Maven 1 安装配置Maven 1.1 下载Maven 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven.   ...

  4. Java 8中Collection转为Map的方法

    Java 8中java.util.stream.Collectors提供了几个方法可用于把Collection转为Map结构,本文记录了个人对其中三个的理解. Method Return Type g ...

  5. ubuntu的NAT方式上网配置

    vm菜单栏虚拟机--->设置---->网络适配器---->勾选NAT方式 vi /etc/network/interfaces修改配置文件如下: auto loiface lo in ...

  6. PCB 线路铜皮面积(残铜率)计算的实现方法

    一个多月没更新博客园了,这里继续分享关于PCB工程相关一些知识,做过PCB工程都知道用使用genesis或incam是可以非常方便的计算得到铜皮面积这个参数[下图],但实际这个软件是通过什么算法计算出 ...

  7. Codeforces 550B 【暴力】

    题意: 有n个数字, 要求在这n个数中选出至少两个数字, 使得它们的和在L,R之间,并且最大的与最小的差值要不小于x 思路: 撒比了啊... 根据状态的话一共也就是2^15-直接暴力,二进制的小魅力还 ...

  8. hdoj1166【线段树】

    单点更新+区间求和 不多说,直接上渣code--- #include<cstdio> #include<iostream> #include<string.h> # ...

  9. TC学习总结

    带宽管理: TC中规定描述带宽: mbps = 1024 kbps = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/s m ...

  10. 普通app自动化测试与手游app自动化测试的区别

    [转载] 手游自动化测试与App自动化测试技术上的区别 手游和App的开发技术不同,导致了两者的自动化测试技术完全不同.一般来说,安卓应用是使用Android SDK开发的,利用Java编写.那么在A ...