题目描述

给定n,a,b,p,其中n,a互质。定义一个长度为n的01串c[0..n-1],其中c[i]==0当且仅当(ai+b) mod n < p。
给定一个长为m的小01串,求出小串在大串中出现了几次。

输入

第一行包含整数n,a,b,p,m(2<=n<=10^9,1<=p,a,b,m<n,1<=m<=10^6)。n和a互质。
第二行一个长度为m的01串。

输出

一个整数,表示小串在大串中出现了几次

样例输入

9 5 6 4 3
101

样例输出

3

提示

假设我们以长串中第i个作为匹配开头,(ai+b)%n=x,那么接下来长串中的字符的表达式就是x+a、x+2a、x+3a……。

如果以i为开头能匹配成功,那么假设短串是0110,就要满足0<=x<p;p<=x+a<n;p<=x+2a<n;0<=x+3a<p(不考虑取模)。

这样就能列出m个不等式,这m个不等式的交集就是以x为开头能成功匹配的x的取值范围。

因为n,a互质,所以不存在两个位置的表达式值相同,x取值范围的区间长度就是答案。

但取模之后就可能将每个不等式的一个取值范围变成开头和结尾的两个,不好求答案。

因此可以找到每个不等式不成立的取值范围,将这些范围取并集,他们的补集就是答案。

将所有不成立区间按左端点排个序,从左到右扫一遍即可。

注:代码中实际是以ai+b中的ai为未知变量,因为ai+b与ai的取值范围长度相同,所以不影响答案。

  1. #include<set>
  2. #include<map>
  3. #include<cmath>
  4. #include<queue>
  5. #include<stack>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<bitset>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. using namespace std;
  13. struct miku
  14. {
  15. int l;
  16. int r;
  17. }f[4000010];
  18. int cnt;
  19. int n,p,a,b,m;
  20. char s[1000010];
  21. int now;
  22. int ans;
  23. void add(int x,int y)
  24. {
  25. cnt++;
  26. f[cnt].l=x;
  27. f[cnt].r=y;
  28. }
  29. void updata(int a,int b,int c,int d)
  30. {
  31. if(a)
  32. {
  33. add(0,a);
  34. }
  35. if(b<c)
  36. {
  37. add(b,c);
  38. }
  39. if(d<n)
  40. {
  41. add(d,n);
  42. }
  43. }
  44. bool cmp(miku a,miku b)
  45. {
  46. return a.l<b.l;
  47. }
  48. int main()
  49. {
  50. scanf("%d%d%d%d%d",&n,&a,&b,&p,&m);
  51. scanf("%s",s);
  52. for(int i=0;i<m;i++,b=(b+a)%n)
  53. {
  54. if(s[i]=='0')
  55. {
  56. updata(0,max(0,p-b),n-b,min(n,n+p-b));
  57. }
  58. else
  59. {
  60. updata(max(p-b,0),n-b,min(n,p+n-b),n);
  61. }
  62. }
  63. for(int i=n-1,b=n-a;i>=n-m+1;b=(b-a+n)%n,i--)
  64. {
  65. add(b,b+1);
  66. }
  67. add(n,n+1);
  68. sort(f+1,f+1+cnt,cmp);
  69. for(int i=1;i<=cnt;i++)
  70. {
  71. if(f[i].l>now)
  72. {
  73. ans+=f[i].l-now;
  74. }
  75. if(f[i].r>now)
  76. {
  77. now=f[i].r;
  78. }
  79. }
  80. printf("%d",ans);
  81. }

BZOJ4377[POI2015]Kurs szybkiego czytania——数学思维题的更多相关文章

  1. BZOJ4377 : [POI2015]Kurs szybkiego czytania

    因为$a$与$n$互质,所以对于$0$到$n-1$里每个$i$,$ai\bmod n$的值互不相同. 设匹配成功的起点为$i$,那么可以得到$3m$段$ai\bmod n$的值不能取的禁区,每段都是连 ...

  2. @bzoj - 4377@ [POI2015] Kurs szybkiego czytania

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n, a, b, p,其中 n, a 互质.定义一个长度为 ...

  3. PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记

    PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...

  4. BZOJ4377 Kurs szybkiego czytania \ Luogu 3589[POI2015]KUR - 数学思维题

    Solution 我又双叒叕去看题解啦$QAQ$, 真的想不到鸭 输入 $a$ 和 $n$ 互质, 所以满足 $a \times i \ mod \ n$ $(0<=i<n)$ 肯定是不重 ...

  5. 51Nod 1003 阶乘后面0的数量(数学,思维题)

    1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...

  6. Gym 100801D Distribution in Metagonia (数学思维题)

    题目:传送门.(需要下载PDF) 题意:t组数据,每组数据给定一个数ni(1 ≤ ni ≤ 10^18),把ni拆成尽可能多的数,要求每个数的素因子只包含2和3,且这些数不能被彼此整除,输出一共能拆成 ...

  7. EOJ2018.10 月赛(B 数学+思维题)

    传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9739115.html 题意: 找到最小的包含子序列a的序列s,并且序列s是 p -莫干山序 ...

  8. EOJ2018.10 月赛(A 数学+思维题)

    传送门:Problem A https://www.cnblogs.com/violet-acmer/p/9739115.html 题意: 能否通过横着排或竖着排将 1x p 的小姐姐填满 n x m ...

  9. zoj 2818 Root of the Problem(数学思维题)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2818 题目描述: Given positive integer ...

随机推荐

  1. Qt 中一些常用类中文说明

    Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...

  2. Google 是如何收集我们的个人数据的

    简评:还有其他公司比 Facebook 更能收集我们的数据么?大概,可能,没准是谷歌.(文末彩蛋) 最近 Facebook 已经因为收集个人数据而站在了聚光灯前,它收集用户数据并因此获利. 但是要知道 ...

  3. 外部Jenkins调用容器中Slave配置实践

    1.Jenkins配置 实现动态生成的Slave节点并调用,解决构建项目出现slave节点任务堵塞或者是slave宕机问题.容器平台采用openshift. 参考配置文档:https://blog.c ...

  4. Linux集锦

    一:Linux文件系统 Linux系统有一个重要概念:一切都都式文件. Linux支持五种文件类型: Linux的目录结构如下: 常见目录说明: /bin: 存放二进制可执行文件(ls,cat,mkd ...

  5. UOJ67 新年的毒瘤 tarjan

    题目传送门 题意:给出一个$N$个点.$M$条边的无向图,找出其中的点,满足去掉该点与和它相连的边之后,这个图会变成一棵树.$N , M \leq 10^5$ 说是毒瘤,真的不毒瘤 思考一下,我们需要 ...

  6. thymeleaf给bootstrap自定义变量赋值

    最近在做一件事情,前端用的是thymeleaf进行渲染,thymeleaf是通过 th的标签来赋值对应的后端变量的.但是遇到一个尴尬的问题,bootstrap是可以通过data-xxx,来自定义变量的 ...

  7. ant+Jacoco 统计tomcat远程部署后项目接口自动化测试或者功能测试代码覆盖率

    1.安装ant 环境,https://ant.apache.org/bindownload.cgi 2.下载jacoco包  https://www.eclemma.org/jacoco/ ,解压后, ...

  8. java 定时器中任务的启动、停止、再启动

    package com.cvicse.ump.timer.service; import java.util.Date; import java.util.Timer; import com.cvic ...

  9. Linux内核期末总结

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 第一周 http://www.cn ...

  10. 我的github地址 https://github.com/1010de/Test.git

    构建之法老师叫交下任务学习github,经过一段时间的学习和了解,看介绍.看视频.看博客.初步认识到github的方便与好处.     自己试着去注册和使用github,已经慢慢学会了一些基本操作. ...