CSU 1597 薛XX后代的IQ

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 

很明显,对于这种类似的给出递推公式的都可以用矩阵快速幂解决。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=2;
int a,x,b,y,c,mod;
ll n;

struct Matrix
{
    int a[maxn][maxn];
    Matrix(){memset(a,0,sizeof(a));}
    Matrix operator* (const Matrix &p)
    {
        Matrix res;
        for(int i=0;i<maxn;i++)
        {
            for(int j=0;j<maxn;j++)
            {
                for(int k=0;k<maxn;k++)
                {
                    res.a[i][j]+=(a[i][k]*p.a[k][j]%mod);
                }
                res.a[i][j]%=mod;
            }
        }
        return res;
    }
}ans,base;

Matrix quick_pow(Matrix base,ll n)
{
    Matrix res;
    for(int i=0;i<maxn;i++)
    {
        res.a[i][i]=1;
    }
    while(n)
    {
        if(n&1) res=res*base;
        base=base*base;
        n>>=1;
    }
    return res;
}

void init_matrix()
{
    ans.a[0][0]=y;
    ans.a[0][1]=x;
    ans.a[1][0]=0;
    ans.a[1][1]=0;
    base.a[0][0]=b;
    base.a[0][1]=1;
    base.a[1][0]=a;
    base.a[1][1]=0;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d%d%lld",&x,&y,&a,&b,&mod,&n);
        init_matrix();
        ans=ans*quick_pow(base,n);
        printf("%d\n",ans.a[0][0]);
    }
    return 0;
}
时间: 2024-11-03 21:40:34

CSU 1597 薛XX后代的IQ的相关文章

薛XX后代的IQ CSU1597【循环节】或【快速幂】

薛先生想改变后代的IQ,为此他发明了一种药,这种药有三种属性:A, B,P.他父亲的智商为X,薛先生的智商为Y,用了这种药之后,薛先生的孩子的智商就可以变为(AX+BY) mod P.后代的智商以此类推. 现在给定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 ≤

15数码(A*)(未完成版)

#include <cstdio> #include <cstring> #include <string> #include <map> #include <windows.h> #include <algorithm> using namespace std; struct Map{int data[4][4],x,y,tot,nxt;Map(){nxt = -1;tot = 0;}}; map<string,bool>

spark-sql的概述以及编程模型的介绍

1.spark sql的概述 (1)spark sql的介绍:   Spark SQL 是 Spark 用来处理结构化数据(结构化数据可以来自外部结构化数据源也可以通 过 RDD 获取)的一个模块,它提供了一个编程抽象叫做 DataFrame 并且作为分布式 SQL 查 询引擎的作用.  外部的结构化数据源包括 JSON.Parquet(默认).RMDBS.Hive 等.当前 Spark SQL 使用 Catalyst 优化器来对 SQL 进行优化,从而得到更加高效的执行方案.并且可以将结果存储

Spark-SQL的具体编程场景

入门案例: object SparkSqlTest { def main(args: Array[String]): Unit = { //屏蔽多余的日志 Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN) Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.project-spark

spark-sql 自定义函数

(1)自定义UDF object SparkSqlTest { def main(args: Array[String]): Unit = { //屏蔽多余的日志 Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN) Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.project-s

三分 --- CSU 1548: Design road

Design road Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1548 Mean: 目的:从(0,0)到达(x,y).但是在0~x之间有n条平行于y轴的河,每条河位于xi处,无限长,wi宽,并分别给出了建立路和桥每公里的单价 求:到达目标的最小费用. analyse: 比赛的时候一直没想到思路,第二个样列怎么算都算不对,赛后才知道是三分. 首先把所有的桥移到最右端,然后三分枚举路和河的交点. Time

csu 1812: 三角形和矩形 凸包

传送门:csu 1812: 三角形和矩形 思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点.然后求出所有的交点.这些点构成一个凸包,求凸包面积就OK了. /************************************************************** Problem: User: youmi Language: C++ Result: Accepted Time: Memory: ***********************************

Trie树 + DFS - CSU 1457 Boggle

Boggle Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457 Mean: 给定n个串,有m个询问. 每个询问给你一个4*4的字符矩阵,你可以在这个字符矩阵中任意字符出发,向四个方向走(已走过的不可重复走),走出一个字符串. 如果n个串中有对应的串和走出的字符串相同,那么需要求出: 1.不同长度的串给了不同的权值,n个串中出现的串的总权值是多少? 2.从出现的字符串中找一个最长的出来,如果有多个,找一个字典

模拟 CSU 1562 Fun House

题目传送门 1 /* 2 题意:光线从 '*' 发射,遇到 '/' 或 '\' 进行反射,最后射到墙上,将 'x' 变成 '&' 3 模拟:仔细读题,搞清楚要做什么,就是i,j的移动,直到撞到墙,模拟一下一次AC,不要被题目吓怕了:) 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <stack> 9 #include <cmath