题目:

有n个正整数排成一行。你的目的是要从中取出一个或连续的若干个数,使它们的和能够被k整除。

例如,有6个正整数,它们依次为1、2、6、3、7、4。若k=3,则你可以取出1、2、6,或者2、6、3、7,也可以仅仅取出一个6或者3使你所取的数之和能被3整除。当然,满足要求的取法不止以上这4种。事实上,一共有7种取法满足要求。

给定n和k,以及这n个数。你的任务就是确定,从这n个数中取出其中一个数或者若干连续的数使它们的和能被k整除有多少方法。

由于取法可能很多,因此你只需要输出它mod 1234567的值即可。

此题好像糊里糊涂看了人家的题解,然后就A了。

在这里膜拜那个大牛。

SUM[i]是代表前i个数的和 

当(SUM[i]-SUM[j]) MOD k=0 这时[j+1,i]就是满足的一个区间
一个方案了 

而我们求的是(SUM[i]-SUM[j]) MOD k=0 这样的方案总个数 

我们又可以推出 上式等价于SUM[i] MOD k=SUM[j] MOD k 

所以我们就是求SUM[i] MOD k=SUM[j] MOD k 的方案个数了 



假设 sum[i],sum[j],..sum[k](共bn个) 都是 MOD k
余数为k-1的sum 

那么从上面bn个sum中任意选取两个就能得出(SUM[i]-SUM[j]) MOD
k=0 

那么在bn个sum中怎么配对呢 



(下面的sum[bn]表示上述bn个sum中的第n个sum) 

很简单 先是sum[b1]与sum[b2] sum[b3] ...sum[bn]
(bn-1 个) 

   然后sum[b2]与sum[b3] sum[b4] ...sum[bn]
(bn-2 个) 

   然后sum[b3]与sum[b4] sum[b5] ...sum[bn]
(bn-3 个) 

   ............ 

   最后sum[bn-1]与sum[bn]         ( 1 个) 



   方案总数=n-1+n-2+n-3+...+1=bn*(bn-1) div


所以 当sum mod k的余数为k-1时有bn*(bn-1) div
2个方案总数了 

就这样依次得出余数为k-1 k-2 k-3 ...0的时候方案总数 再相加一下得出答案 

所以在读入一个数的时候就计算sum然后计算sum mod k 的余数 

而b[j]表示余数为j的sum个数 此时根据上面新得出的更新相应的b[j] 

这样在读入完毕之后就可以根据b[j]直接计算总方案数了 

特别值得注意的是!!!! 

计算余数为0的方案总数时候还要加上b[0]  也就是b[0]*(b[0]-1)
div 2+b[0] 

为什么?? 因为余数为0的时候单独一个sum[i]就能成为一个方案了

还有比如div
2可以用shr 1 这样可以加快速度

var
  g:array[0..1000000] of longint;
  t,p,k,n,i:longint;
  tt,tot,x:int64;

begin
  readln(n,k); tt:=0; tot:=0;
  for i:=0 to k do
    g[i]:=0;
  g[0]:=1;
  for i:=1 to n do
    begin
      read(x);
      tt:=tt+x;
      tt:=tt mod k;
      tot:=(tot+g[tt]) mod 1234567;
      inc(g[tt]);
      g[tt]:=g[tt] mod 1234567;
    end;
  writeln(tot);
end.
												

vijos1090题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Python 随机生成有效手机号码及身份证

    中国那么大,人那么多,几乎人手一部手机.手机号码已经作为各大互联网站的注册账户.同样,身份证更是如此.以下是生成有效手机号码和身份证号. 身份证需要下载districtcode.txt这个文件:htt ...

  2. OpenStack命令 创建网络和路由管理

    1.登陆用户 :tdy(前提条件创建了tdy用户) 编写登陆用户tdy用户 脚本文件  user-operc.sh user-operc.sh : 登陆用户tdy: $ source user-ope ...

  3. linux中搭建java开发环境

    JDK安装 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载对应jdk版本, ...

  4. 给sftp创建新用户、默认打开和限制在某个目录

    一.环境: CentOS 6.8 使用 FileZilla 进行 sftp 连接 二.背景 给外包的工作人员提供我司服务器的某一目录的访问(包括读写)权限,方便他们部署代码文件. 之所以是某一目录的访 ...

  5. My "Top 5 R Functions"(转)

    In preparation for a R Workgroup meeting, I started thinking about what would be my "Top 5 R Fu ...

  6. 一个html页面传入参数到另一个html页面用js获取方法

    没错使用以下函数就能够完整的获取到路径里的你想要的参数:function getURLParameter(name) { return decodeURIComponent((new RegExp(' ...

  7. 多线程编程-- part 5.3 LockSupport

    一.LockSupport的介绍 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语.  LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程 ...

  8. CentOS 虚拟机安装详解

    第一步:安装 VMware 官方网站:www.vmware.com 下载百度云链接:http://pan.baidu.com/s/1bphDOWv 密码:0zix VMware 是一个虚拟 PC 的软 ...

  9. Java文件流应用:剪切文件

    剪切的实际操作是: 第一步,先复制文件到指定位置, 第二步,删除原文件,这样就实现了剪切 与复制文件相比,多了一步删除文件 注意:删除文件必须在流关闭后,才能删除,否则,删除不了. 实例代码 pack ...

  10. PHP文件操作,多行句子的读取,file()函数,file_get_contents()函数,file_put_contents()函数,is_file,统计网站pv (访问量),文件的复制 copy,文件重命名 rename,删除文件 unlink

    php中添加utf-8: header("Content-type:text/html;charset='UTF-8'"); 文件操作步骤: 1.在同一目录下建立一个file.tx ...