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代码如下:
by lych
2016.3.28
然后按照给定的串的每一位,得到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
相关文章推荐
- codeforces 653E. Bear and Forgotten Tree 2 连通问题
- Google的Protobuf协议分析
- Golang学习笔记:常见问题
- window.history back/go/forward/reload
- window.history.go(-1)和window.location.go(-1)的区别
- Django的一些优缺点评析
- django orm总结
- google glog
- PG 函数的易变性(Function Volatility Categories)
- 易景地球如何加载google等在线地图数据
- 使用Go语言工作400天后的感受
- Go语言圣经中文版
- GoAhead 2.1.8嵌入式webserver源码分析学习(一)---开篇
- codeforces 23D Tetragon 计算几何
- Google浏览器导出书签
- Unicode Category
- django模板继承
- [LeetCode]-algorithms-String to Integer (atoi)
- [LeetCode]-algorithms-Reverse Integer
- [LeetCode]-algorithms-Longest Palindromic Substring