XTU (湘潭大学) 2011 新生练习赛(第一场)/ Problem H 子段和计数

返回目录

 

此题尚有问题,明天改过

 

题目大意:一个数组长度为n的数组A,求出其中和是B的倍数的子段有多少个,结果mod B后输出。
子段:像A2A3A4A5A6这样连续的一段。

 

题目类型:暴力枚举

 

题目分析:

开始以为是dp,但是后来发现他没有要求最优化,只是求总和,所以算是枚举吧。

记di为第i位之前的符合的子段个数,则 d[i] = d[i-1]+ans[i].

这里的ans[i]是指把第i位纳入考虑后,多出的符合的子段个数。所以只要枚举后缀即可。

注意枚举后缀。

这题要交的时候比赛正好过5点。。。没交成,等题目放出来再去验证。。。

 

代码:

 

#include<cstdio> #include<cstring> #include<malloc.h> using namespace std; #define MAXN 100002 int a[MAXN]; int d[MAXN]; int vis[MAXN]; int n, b; int dp(int cur) { if(cur == 0) return 0; if(vis[cur]) return d[cur]; vis[cur] = 1; int sum=0; int ans=0; for(int i=cur; i>=0; i--) { sum += a[i]; if(sum%b == 0) ans++; } return d[cur] = dp(cur-1)+ans; } int main() { while(scanf("%d", &n) && n) { scanf("%d", &b); memset(vis, 0, sizeof(vis)); for(int i=0; i<n; i++) scanf("%d", &a[i]); printf("%d/n", dp(n-1)%b); } }

你可能感兴趣的:(优化)