BZOJ 3240 矩阵游戏

矩阵不要乱用欧拉定理。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 1000000007
#define maxn 1000050
using namespace std;
char n[maxn],m[maxn];
long long n1,n2,m1,m2,k,k1,k2,a,b,c,d,ans;
long long f_pow(long long a,long long b)
{
    long long base=a,ans=1;
    while (b)
    {
        if (b&1) ans=(ans*base)%mod;
        base=(base*base)%mod;
        b>>=1;
    }
    return ans;
}
long long inv(long long a)
{
    return f_pow(a,mod-2);
}
long long ask(long long k1,long long k2)
{
    if (k1==1) return n1*k2%mod+1;
    return (f_pow(k1,n2)+(f_pow(k1,n2)-1+mod)%mod*inv(k1-1)%mod*k2%mod)%mod;
}
void work1()
{
    m1=(m1-1+mod)%mod;
    k1=c;k2=b*c%mod*m1%mod+d;k2%=mod;
    ans=ask(k1,k2);
    ans=(ans-d+mod)%mod*inv(c)%mod;
}
void work2()
{
    m2=(m2-2+mod)%(mod-1);
    k1=f_pow(a,m2)*c%mod;k2=b*c%mod*((f_pow(a,m2)-1+mod)%mod)%mod*inv(a-1)%mod+d;
    ans=ask(k1,k2);
    ans=(ans-d+mod)%mod*inv(c)%mod;
}
int main()
{
    long long l;
    scanf("%s",n);l=strlen(n);
    for (long long i=0;i<l;i++)
    {
        n1=(n1*10+n[i]-‘0‘)%mod;
        n2=(n2*10+n[i]-‘0‘)%(mod-1);
    }
    scanf("%s",m);l=strlen(m);
    for (long long i=0;i<l;i++)
    {
        m1=(m1*10+m[i]-‘0‘)%mod;
        m2=(m2*10+m[i]-‘0‘)%(mod-1);
    }
    scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
    if (a==1) work1();
    else work2();
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-08-01 02:51:03

BZOJ 3240 矩阵游戏的相关文章

BZOJ 1059 矩阵游戏(神奇的二分图匹配)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1059 题意:给出一个N*N的01矩阵.有两种操作:(1)交换任意两行:(2)交换任意两列.问最后能否使得主对角线上全部为1? 思路:我们发现,对于同一行的两个1,比如 (i,j)和(i,j+1),无论如何我们也不能把这两个1都移动到主对角线上,换句话说,最多能够将其中一个1移动到主对角线上.因为,若我们想将这两 个同时移动到主对角线上,不妨设为(i1,i1),(i2,i2).首先,我们

[BZOJ]1059 矩阵游戏(ZJOI2007)

虽然说是一道水题,但小C觉得还是挺有意思的,所以在这里mark一下. Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵的任意行列,交换这两列(即交换对应格子的颜色)游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色.

bzoj 3240 矩阵乘法+十进制快速幂

首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)*b)^(n-1)*(a^(m-1)). 然后用用十进制快速幂(因为输入用的是10进制,这样就避免了高精度除法). 第一次写十进制快速幂,大概的思想是维护当前位是1-9的要乘的矩阵,然后再通过这9个矩阵自己转移. 1 /**********************************************

bzoj 1059 矩阵游戏

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题解: 很玄学的问题…… 因为不同行或者不同列的格子,交换仍然不同行或者不同列 所以把问题转化为从黑格子里选n个,它们的横纵坐标都不相同 然后二分图匹配……两个子集分别是横坐标和纵坐标,如果求出的最大匹配为n,则成立,否则不成立 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 410 4 int n,cnt,

【BZOJ】【3240】【NOI2013】矩阵游戏

十进制快速幂+矩阵乘法+常数优化 听说这题还可以强行算出来递推式……然后乘乘除除算出来…… 然而蒟蒻选择了一个比较暴力的做法= = 我们发现这个递推的过程是线性的,所以可以用矩阵乘法来表示,$x=a*x+b$这样一个递推式我们可以这样表示:$$\begin{bmatrix} x& 1 \end{bmatrix} * \begin{bmatrix} a& 0 \\ b& 1 \end{bmatrix} $$ 那么我们可以令$s_1$表示×a+b,$s_2$表示×c+d,那么我们有$$

bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下面的递推式: F[1][1]=1F[i,j]=a*F[i][j-1]+

BZOJ 3240 [Noi2013] 矩阵游戏 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24594825 [原题] 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 336  Solved: 158 [Submit][Status] Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质

【BZOJ】【1059】【ZJOI2007】矩阵游戏

二分图完美匹配/匈牙利算法 如果a[i][j]为黑点,我们就连边 i->j ,然后跑二分图最大匹配,看是否有完美匹配. <_<我们先考虑行变换:对于第 i 行,如果它第 j 位是黑点,那么我们一定可以通过交换行来将这一行放到新矩阵的第 j 行,使a[j][j]这一位满足题目要求:同时,第 j 行也必须有一个原矩阵的行放过来,这样,就满足一一对应的关系,所以就是[匹配]了…… 然而列变换:我们交换两列a和b,只是相当于将原来从左部连到右部的 a 点的边,与从左部连到右部的 b 点的边交换了

bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1891  Solved: 919[Submit][Status] Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵