codeforces #305 A Mike and Frog

挺简单的题目,但是有一堆恶心的边界

在刨去恶心的边界之后:

假定我们知道两边的循环节为b1,b2

其中h第一次到达目标的时间为a1,a2

又知道对于答案t

t=a1+b1*t1=a2+b2*t2

不妨枚举t1,判断是否存在可行解即可

又因为LCM(b1,b2)就开始循环了

且b1*b2<=b1*mod

所以我们枚举t1的范围在[0,mod]即可

如果在这个范围内无解,则一定无解

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

typedef long long LL;
bool vis[1000010];
int mod,h,a,x,y;
int Go(int h,int x,int y){
	memset(vis,0,sizeof(vis));
	int cnt=0;
	while(1){
		if(vis[h])return -1;
		vis[h]=1;
		h=(1LL*h*x+y)%mod;
		++cnt;
		if(h==a)return cnt;
	}
}

int main(){
	scanf("%d",&mod);
	scanf("%d%d%d%d",&h,&a,&x,&y);
	int a1=Go(h,x,y),b1=Go(a,x,y);
	scanf("%d%d%d%d",&h,&a,&x,&y);
	int a2=Go(h,x,y),b2=Go(a,x,y);
	if(a1==-1||a2==-1){printf("-1\n");return 0;}
	if(b1==-1&&b2==-1){
		if(a1==a2)printf("%d\n",a1);
		else printf("-1\n");
		return 0;
	}
	if(b1!=-1&&b2!=-1){
		for(int i=0;i<=mod;++i){
			if(a1+1LL*b1*i>=a2&&(a1+1LL*b1*i-a2)%b2==0){
				cout<<a1+1LL*b1*i<<endl;
				return 0;
			}
		}printf("-1\n");
		return 0;
	}else{
		if(b1==-1)swap(a1,a2),swap(b1,b2);
		if(a2>=a1&&(a2-a1)%b1==0)printf("%d\n",a2);
		else printf("-1\n");
	}return 0;
}

  

时间: 2024-12-25 23:15:21

codeforces #305 A Mike and Frog的相关文章

codeforces #305 B Mike and Feet

跟之前做过的51Nod的移数博弈是一样的QAQ 我们考虑每个数的贡献 定义其左边第一个比他小的数的位置为L 定义其右边第一个比他小的数的位置为R 这个可以用排序+链表 或者 单调队列 搞定 那么对于区间长度1->(R-L-1),该数都可以作为最小值出现 我们在R-L-1上打上标记,最后从后往前来更新答案即可 至此问题得解 #include<cstdio> #include<cstring> #include<iostream> #include<algori

codeforces #305 D Mike and Fish

正解貌似是大暴搜? 首先我们考虑这是一个二分图,建立网络流模型后很容易得出一个算法 S->行 容量为Num[X]/2; 行->列 容量为1 且要求(x,y)这个点存在 列->T 容量为Num[Y]/2 这样子跑网络流之后我们就得到了一组解 但是我们考虑输出方案 对于每一行,如果Num[X]为偶数,那么显然输出方案是正确的 但是如果Num[x]为奇数,多出的那个显然既有可能是红的也可能是蓝的 但关键是我们不能确定他是红的或者蓝的,因为他的状态也会影响对应的列 同样,列的考虑也是同理 所以我

codeforces #305 E Mike and friends

原问题可以转化为:给定第k个字符串,求它在L-R的字符串里作为子串出现了多少次 定义子串为字符串的某个前缀的某个后缀(废话) 等价于我们把一个字符串插入到trie里,其过程中每个经过的节点和其向上的fail链上的点都是该字符串的子串 又因为对于一条fail链,u向上能访问到v当前仅当u在v的子树内 那么原问题又变成了: 将L-R个字符串按照上述方法插入到trie中并将经过的节点的val值增加 求第k个字符串对应的单词节点在fail树上的子树的权值和 又因为查询的信息满足区间可减性,所以我们可以建

数论/暴力 Codeforces Round #305 (Div. 2) C. Mike and Frog

题目传送门 1 /* 2 数论/暴力:找出第一次到a1,a2的次数,再找到完整周期p1,p2,然后以2*m为范围 3 t1,t2为各自起点开始“赛跑”,谁落后谁加一个周期,等到t1 == t2结束 4 详细解释:http://blog.csdn.net/u014357885/article/details/46044287 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #in

Codeforces 798D:Mike and distribution

Codeforces 798D:Mike and distributio 题目链接:http://codeforces.com/problemset/problem/798/D 题目大意:给出两个大小为$n$的数列$A,B$,现要求从这两个数列相同位置取出$K(K \leqslant n/2+1)$个数,使得$2 \times subA>sumA$且$2 \times subB>sumB$. 想法题 我们需要从数列$A$和数列$B$中取出$K$个数,使得这$K$个数的和比剩下$n-K$个数的和

Codeforces Round #305 (Div. 2) C. Mike and Frog +B. Mike and Fun

Mike has a frog and a flower. His frog is named Xaniar and his flower is named Abol. Initially(at time 0), height of Xaniar is h1 and height of Abol is h2. Each second, Mike waters Abol and Xaniar. So, if height of Xaniar is h1 and height of Abol is 

#305 (div.2) C. Mike and Frog

1.题目描述:点击打开链接 2.解题思路:本题是一道模拟题,虽然看上去像数学,但实际上只需要模拟一下这个过程就好了.首先,我们先让h1变为a1,设需要k1步才可以,如果h2经过k1步也变为a2,那么直接输出答案.否则,我们接下来找h1变化的循环节cycle,即每经过一个cycle,就可以再到达a1.那么我们看h2需要几个cycle才可以从当前位置(即第k1步时候的位置)到达a2,假设只需要k2步,那么最终的答案就是k2*cycle+k1. 本题的细节比较多,详细过程还需要见注释部分好好理解. 3

codeforces 547A Mike and Frog

最近都是这种题呢...... 哎 开始想纯暴力(体现在跳出循环t>=那里,,,,),,,,随着数据变大.....(t=499981500166是可以的),,,,,,,23333333 超时代码: #include <iostream> #include<bits/stdc++.h> using namespace std; int main() { long long int mod; scanf("%lld",&mod); long long i

Codeforces548C:Mike and Frog

Mike has a frog and a flower. His frog is named Xaniar and his flower is named Abol. Initially(at time 0), height of Xaniar is h1 and height of Abol is h2. Each second, Mike waters Abol and Xaniar. So, if height of Xaniar is h1 and height of Abol is