您的位置:首页 > 移动开发 > 微信开发

清华集训魔法小程序

2018-02-16 22:21 288 查看
多维前缀和的逆运算,只需要对于每一位减除其在这一位上的前缀接收点的答案就可以了。

我们考虑要减去至少有一位不一样的,那我们考虑最后一位是哪一位,然后减除贡献之后多余的贡献就不要计算了。

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1111111;
#define int long long

int n , m , x , y , a
, c
, s = 1;

main(void) {
for(int i = scanf("%lld" , &n) * printf("%lld\n" , n) * 0;i < n;++ i) scanf("%lld" , &a[i]) , printf("%lld " , a[i]);
for(int i = scanf("%lld" , &m) * printf("\n%lld\n" , m) * 0;i < m;++ i) scanf("%lld" , &c[i]); a[n ++] = m;
for(int i = 0;i < n;++ i) if(a[i] - 1) {
for(int j = m - 1;j >= 0;-- j) if(j % (s * a[i]) >= s) c[j] -= c[j - s]; s *= a[i];
if(s >= m) break;
}
for(int i = 0;i < m;++ i) printf("%lld " , c[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: