BZOJ4377[POI2015]Kurs szybkiego czytania——数学思维题
题目描述
给定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串。
输出
一个整数,表示小串在大串中出现了几次
样例输入
101
样例输出
提示

假设我们以长串中第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的取值范围长度相同,所以不影响答案。
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct miku
{
int l;
int r;
}f[4000010];
int cnt;
int n,p,a,b,m;
char s[1000010];
int now;
int ans;
void add(int x,int y)
{
cnt++;
f[cnt].l=x;
f[cnt].r=y;
}
void updata(int a,int b,int c,int d)
{
if(a)
{
add(0,a);
}
if(b<c)
{
add(b,c);
}
if(d<n)
{
add(d,n);
}
}
bool cmp(miku a,miku b)
{
return a.l<b.l;
}
int main()
{
scanf("%d%d%d%d%d",&n,&a,&b,&p,&m);
scanf("%s",s);
for(int i=0;i<m;i++,b=(b+a)%n)
{
if(s[i]=='0')
{
updata(0,max(0,p-b),n-b,min(n,n+p-b));
}
else
{
updata(max(p-b,0),n-b,min(n,p+n-b),n);
}
}
for(int i=n-1,b=n-a;i>=n-m+1;b=(b-a+n)%n,i--)
{
add(b,b+1);
}
add(n,n+1);
sort(f+1,f+1+cnt,cmp);
for(int i=1;i<=cnt;i++)
{
if(f[i].l>now)
{
ans+=f[i].l-now;
}
if(f[i].r>now)
{
now=f[i].r;
}
}
printf("%d",ans);
}
BZOJ4377[POI2015]Kurs szybkiego czytania——数学思维题的更多相关文章
- BZOJ4377 : [POI2015]Kurs szybkiego czytania
因为$a$与$n$互质,所以对于$0$到$n-1$里每个$i$,$ai\bmod n$的值互不相同. 设匹配成功的起点为$i$,那么可以得到$3m$段$ai\bmod n$的值不能取的禁区,每段都是连 ...
- @bzoj - 4377@ [POI2015] Kurs szybkiego czytania
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n, a, b, p,其中 n, a 互质.定义一个长度为 ...
- PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记
PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...
- BZOJ4377 Kurs szybkiego czytania \ Luogu 3589[POI2015]KUR - 数学思维题
Solution 我又双叒叕去看题解啦$QAQ$, 真的想不到鸭 输入 $a$ 和 $n$ 互质, 所以满足 $a \times i \ mod \ n$ $(0<=i<n)$ 肯定是不重 ...
- 51Nod 1003 阶乘后面0的数量(数学,思维题)
1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...
- Gym 100801D Distribution in Metagonia (数学思维题)
题目:传送门.(需要下载PDF) 题意:t组数据,每组数据给定一个数ni(1 ≤ ni ≤ 10^18),把ni拆成尽可能多的数,要求每个数的素因子只包含2和3,且这些数不能被彼此整除,输出一共能拆成 ...
- EOJ2018.10 月赛(B 数学+思维题)
传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9739115.html 题意: 找到最小的包含子序列a的序列s,并且序列s是 p -莫干山序 ...
- EOJ2018.10 月赛(A 数学+思维题)
传送门:Problem A https://www.cnblogs.com/violet-acmer/p/9739115.html 题意: 能否通过横着排或竖着排将 1x p 的小姐姐填满 n x m ...
- zoj 2818 Root of the Problem(数学思维题)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2818 题目描述: Given positive integer ...
随机推荐
- 在TerraExplorer中如何批量根据shape多边形对象创建TerrainModify对象?
其实,在Skyline中TerrainModify对象就是一个特殊类型Polygon对象,他们的Geometry是可以直接交换使用的: <!DOCTYPE html PUBLIC "- ...
- Java多线程编程模式实战指南之Promise模式
Promise模式简介(转) Promise模式是一种异步编程模式 .它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作.等 ...
- java中使用jxl读取excel中的数据
package bboss; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impo ...
- LiveCharts文档-4基本绘图-3其他
原文:LiveCharts文档-4基本绘图-3其他 4基本绘图-3其他 因为每个图表的使用方法大同小异,所以不再啰嗦重复,具体直接看这个链接里的介绍.原文链接 其他的图表类型有 基本堆叠图 基本条形图 ...
- Ionic Android项目Splash设置
ionic项目中,在splashscreen消失后会出现零点几秒的白屏,再出现app页面. 1. 安装Cordova splash screen插件 ionic plugin add org.apac ...
- GBDT和随机森林的区别
GBDT和随机森林的相同点: 1.都是由多棵树组成 2.最终的结果都是由多棵树一起决定 GBDT和随机森林的不同点: 1.组成随机森林的树可以是分类树,也可以是回归树:而GBDT只由回归树组成 2.组 ...
- hibernate 解决 java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
参考:https://stackoverflow.com/questions/9851528/java-lang-noclassdeffounderror-org-hibernate-cfg-conf ...
- 在python中使用正则表达式(一)
在python中通过内置的re库来使用正则表达式,它提供了所有正则表达式的功能. 一.写在前面:关于转义的问题 正则表达式中用“\”表示转义,而python中也用“\”表示转义,当遇到特殊字符需要转义 ...
- .Net并行编程(一)-TPL之数据并行
前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程.利用硬件的特性,使用并行化代码以在多个处理器之间分配工作. 应用场景 文件批量上传 并行上传单个文件.也可以把一个文件拆成几段分开 ...
- Munge服务部署和测试
1. 概述2. 下载3. 安装3.1 源码简要说明3.2 编译安装3.3 配置3.4 创建munge.key3.5 启动方式 1. 概述 munge是认证服务,用于生成和验证证书.应用于大规模的HPC ...