您的位置:首页 > 其它

csu 1597 薛XX后代的IQ(循环节)

2016-08-18 15:51 369 查看


薛XX后代的IQ

Time Limit: 1 Sec Memory Limit: 128 MB

Submit: 210 Solved: 54

[Submit][Status][Web
Board]


Description

薛XX的低IQ是个令人头疼的问题,他的队友深受其害。幸运的是,薛XX非常有钱,所以他买了一些可以提高他的后代的IQ的药。这种药有三个属性,A,B和P。当薛XX使用这种药的时候,他的基因会发生变化,所以他的儿子的IQ也会跟着变化。假设薛XX的父亲的IQ为X,薛XX自己的IQ为Y,那么薛XX的儿子的IQ为(A*X+B*Y) mod P。薛XX的孙子的IQ依次类推。

现在给定X和Y,还有药的属性A、B和P,现在他想知道他的N代子孙的IQ(儿子是第一代,孙子是第二代)。


Input

第一行包含一个整数T(T<=100),表示数据组数

每组数据只有一行,包含六个整数X,Y,A,B,P,N(1 ≤ X, Y ≤ 300,1 ≤ A, B ≤ 30, 1≤ P ≤ 300 , 1 ≤ N < 1000000000),含义如题目所述


Output

对于每组数据,输出答案


Sample Input

4
180 80 1 1 190 1
189 83 2 2 190 1
189 83 1 1 190 2
172 73 23 19 273 9999


Sample Output

70
164
165
233

题意:中文题不解释

思路:n有10e,直接暴力肯定不行。

观察数据可以发现x和y始终在0~300之间,那么最多只会进入90000种状态, 只要当前出现的(x,y)这两个数之前出现过,那么就会进入循环节。

判断一下即可

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
int dp[305][305];
int main()
{
int x,y,a,b,p,n,T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d %d %d %d",&x,&y,&a,&b,&p,&n);
memset(dp,0,sizeof(dp));
int id=-1;
for(int i=1; i<=n; i++)
{
if(dp[x][y])
{
id=i;
break;
}
dp[x][y]=i;
int iq=(a*x+b*y)%p;
x=y,y=iq;
}
if(id==-1) printf("%d\n",y);
else
{
int len=id-dp[x][y];
int d=(n-dp[x][y])%len;
if(d==0) d=len;
for(int i=1; i<=d; i++)
{
int iq=(a*x+b*y)%p;
x=y,y=iq;
}
printf("%d\n",(a*x+b*y)%p);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: