您的位置:首页 > 编程语言 > Go语言

bzoj4377 Kurs szybkiego czytania 数学

2016-03-28 20:02 525 查看
令f(i)=ai+b,由题意(a,n)==1,那么可以得到f(i)两两不同。同时可以发现对于一个f(i),如果f(i)已经确定,那么i~i+m-1的01串也就确定了,因此我们可以判断f(i)为开头时是否与给定串相同。

然后按照给定的串的每一位,得到f(i)不可能出现的位置;另外f(n-m+1)~f(n-1)也是不可能的。那么把所有不可能的求并,然后补集的大小就是答案。

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,a,b,p,m,cnt; struct node{ int x,y; }c[4000005];
void add(int x,int y){
if (x<=y){ c[++cnt].x=x; c[cnt].y=y; } else{
c[++cnt].x=x; c[cnt].y=n-1;
c[++cnt].x=0; c[cnt].y=y;
}
}
bool cmp(node x,node y){ return x.x<y.x; }
int main(){
scanf("%d%d%d%d%d",&n,&a,&b,&p,&m);
int i,now=0; char ch=getchar();
while (ch<'0' || ch>'9') ch=getchar();
for (i=1; i<=m; i++,ch=getchar(),now=(now+a)%n){
if (ch=='0') add((p-now+n)%n,(n-1-now+n)%n); else
add((n-now)%n,(p-1-now+n)%n);
}
for (i=1,b=(b-a+n)%n; i<m; i++,b=(b-a+n)%n) add(b,b);
sort(c+1,c+cnt+1,cmp);
int tail=-1,ans=0;
for (i=1; i<=cnt; i++)
if (c[i].x>tail){ ans+=c[i].x-tail-1; tail=c[i].y; }
else tail=max(tail,c[i].y);
printf("%d\n",ans+n-1-tail);
return 0;
}


by lych
2016.3.28
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: