码迷,mamicode.com
首页 > 其他好文 > 详细

Be Efficient(Light Oj 1134)

时间:2018-10-02 22:26:18      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:div   func   前缀和   aic   abap   false   display   lock   oca   

题目传送门:Be Efficient 

题意:输入n和m,然后输入有n个元素的一个序列,问有多少个子序列元素的和能整除m。

思路:求前缀和,利用一个前缀的一个定理求解。

前缀和的一个定理是:每次求的前缀和对m取余,两个相等的结果之间的序列的和就是m的倍数。

技术分享图片技术分享图片?

如上序号1、4的结果相同,则序号2、3、4的和是4的倍数,序号2、3的结果相同,则序号3是4的倍数。

注意:将储存取余结果的数组pre的pre[0]设置为1,因为后边前缀和取余为0,表明这一组自己就是4的倍数,直接从1开始。

PS:用long long,算错了数据范围,被爆int卡到吐……

代码:

技术分享图片
 1 /*
 2     Time:2018/9/6
 3     Writer:Sykai
 4     Function:L
 5 */
 6 #include <iostream>
 7 #include <cstdio>
 8 #include <algorithm>
 9 #include <set>
10 #include <cstring>
11 #include <queue>
12 #define INF 0x3f3f3f3f
13 #define FRE() freopen("in.txt","r",stdin)
14 using namespace std;
15 const int maxn = 1e5+10;
16 const int MOD = 1e9 + 7;
17 typedef long long ll;
18 typedef pair<int,int> P;
19 ll pre[maxn],n,m;
20 
21 inline void init()
22 {
23     memset(pre,0,sizeof(pre));
24 }
25 
26 int main()
27 {
28     int T,cnt = 0;
29     scanf("%d",&T);
30     while(T--)
31     {
32         scanf("%lld%lld",&n,&m);
33         init();
34         ll sum = 0,ans = 0;
35         pre[0] = 1;
36         for(int i = 1; i<=n; i++)
37         {
38             ll t;
39             scanf("%lld",&t);
40             sum = (sum+t) % m;
41             ans += pre[sum];
42             pre[sum]++;
43         }
44         printf("Case %d: %lld\n",++cnt,ans);
45     }
46     return 0;
47 }
View Code

 

Be Efficient(Light Oj 1134)

标签:div   func   前缀和   aic   abap   false   display   lock   oca   

原文地址:https://www.cnblogs.com/sykline/p/9737899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!