zoukankan      html  css  js  c++  java
  • 【YBTOJ】合法序列

    题目大意:

    给你一个长度为 (n) 的正整数序列,如果一个连续的子序列,子序列的和能够被 (k) 整除,那么就视此子序列合法,求原序列包括多少个合法的连续子序列?

    正文:

    如果一段区间要合法,那么就要满足这个条件:

    [sum_{i=l}^{r}a_iequiv 0pmod{k} ]

    先考虑暴力。直接枚举,(O(n^3))

    优化这个暴力,我们一般可以使用前缀和,(O(n^2))

    利用前缀和那么条件就变成了:

    [egin{aligned} ext{sum}_r- ext{sum}_{l-1}&equiv 0&pmod{k}\ ext{sum}_r&equiv ext{sum}_{l-1}&pmod{k} end{aligned}]

    也就是说,我们可以先求前缀和,再枚举余数,只要有前缀和模 (k) 余数的个数大于二的(即能匹配到的)就用排列组合求出它的价值,也就是 (frac{t imes(t-1)}{2}) 其中 (t) 表示前缀和模 (k) 余数的个数。

    代码:

    
    int main() {
    	for (scanf ("%d", &t); t--; ) {
    		scanf ("%d%d", &k, &n);
    		memset (sum, 0, sizeof sum);
    		memset (bucket, 0, sizeof bucket);
    		for (int i = 1; i <= n; i++) {
    			scanf ("%lld", &sum[i]);
    			sum[i] += sum[i - 1];
    			bucket[sum[i] % k]++;
    		}
    		ll ans = 0;
    		++ bucket[0];
    		for (int i = 0; i < k; i++)
    			if (bucket[i] >= 2)
    			{
    				ans += bucket[i] * (bucket[i] - 1) / 2;
    			}
    		printf ("%lld
    ", ans);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    ireport字体无效处理
    java web调用打印机打印pdf文件
    Extjs中如何在一行textfield后面增加文字提示
    java 压缩文件
    filter加载springbean
    Elasticsearch问题记录
    dubbo管控台的安装记录及dubbo开发调试记录
    mysql索引整理
    fastdfs集群搭建3
    fastdfs集群搭建2
  • 原文地址:https://www.cnblogs.com/GJY-JURUO/p/14149279.html
Copyright © 2011-2022 走看看