首页 > 其他分享 >4954: 矩阵游戏

4954: 矩阵游戏

时间:2023-08-12 14:56:05浏览次数:36  
标签:MOD1 begin end 游戏 t2 ll 矩阵 aligned 4954

题目描述

婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的 \(n\) 行 \(m\) 列的矩阵(你不用担心她如何存储)。她生成的这个矩阵满足一个神奇的性质:若用 \(F[i,j]\) 来表示矩阵中第 \(i\) 行第 \(j\) 列的元素,则 \(F[i,j]\) 满足下面的递推式:

\[\begin{aligned} F[1, 1] &= 1 \\ F[i, j] &=a\times F[i, j-1]+b, &j\neq 1 \\ F[i, 1] &=c\times F[i-1, m]+d, &i\neq 1 \\ \end{aligned}\]

递推式中 \(a,b,c,d\) 都是给定的常数。

现在婷婷想知道 \(F[n,m]\) 的值是多少,请你帮助她。由于最终结果可能很大,你只需要输出 \(F[n,m]\) 除以 \(10^9+7\) 的余数。

输入格式

包含一行有六个整数 \(n,m,a,b,c,d\)。意义如题所述。

输出格式

包含一个整数,表示 \(F[n,m]\) 除以 \(10^9+7\) 的余数。

样例 #1

样例输入 #1

3 4 1 3 2 6

样例输出 #1

85

提示

【样例1说明】

样例中的矩阵为:

\[\begin{pmatrix} 1 & 4 & 7 & 10 \\ 26 & 29 & 32 & 35 \\ 76 & 79 & 82 & 85 \\ \end{pmatrix}\]

F[1, m] 从 F[1, 1]转换:

\[\begin{aligned} F[1, m] &=t1*F[1, 1] + t2\\ \end{aligned}\]

\[\begin{aligned} &t1=a^{m-1},t2= S_n * b\\ &F[1, 1]=1\\ &S_n = a^0 + a^1 ... +a^{m-2} \end{aligned}\]

F[2, 1] 从 F[1, m]转换:

\[\begin{aligned} F[2, 1] &=c*(t1+ t2) + d\\ \end{aligned}\]

可以得到F[1, m]->F[2, m]的转移公式

\[\begin{aligned} F[2, m] &=t1*(c*F[1, m]+d)+t2 \\ \end{aligned}\]

\[\begin{aligned} F[2, m] &=t3*F[1, m]+t4 \\ \end{aligned}\]

\[\begin{aligned} t3 = c*t1\\ t4 = t1*d+t2 \end{aligned}\]

同理可推出F[1, m]->F[n, m]的转移公式

\[\begin{aligned} F[n, m] &=t5*F[1, m]+t6 \\ \end{aligned}\]

\[\begin{aligned} t5 = t3^{n-1}\\ t6 = t4*S_n\\ S_n = t4^0 + t4^1 ... +t4^{n-2} \end{aligned}\]

同时使用费马小定理

\[\begin{aligned} a^{p-1} \equiv 1\ (mod\ p) \end{aligned}\]

将m和n降次到1e9以内,可用等比数列公式+快速幂进行运算

\[S_n= \begin{cases} -x,\quad q= 1\\ (1-q^n)/(1-q), \ &q\neq 1 \end{cases} \]

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<PII, int> PPI;
#define io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define FOR(i,s,e)for(int i=(s);i<=(e);i++)
#define mem(a, b) memset((a), (b), sizeof(a))
#define inf 0x3f3f3f3f
#define seed 13331
#define MOD1 1000000007
#define MOD2 1000000009
#define MOD3 998244353
const int N = 2e5+7;
ll qmi(ll m, ll k, ll p)
{
    ll res = 1%p, t = m;
    while(k)
    {
        if(k&1) 
            res = res*t % p;
        t= t*t%p;
        k >>=1;
    }
    return res;
}
ll gp(ll q, ll n)
{
    return (qmi(q,n,MOD1)-1) * qmi(q-1, MOD1-2,MOD1) % MOD1;
}
void solve(int i_)
{   
    string s1,s2;
    cin>>s1>>s2;
    ll n1=0,n2=0,m1=0,m2=0;
    for(auto c:s1)
    {
        n1 = (n1*10+c-'0')%(MOD1-1);
        n2 = (n2*10+c-'0')%(MOD1);
    }   
    for(auto c:s2)
    {
        m1 = (m1*10+c-'0')%(MOD1-1);
        m2 = (m2*10+c-'0')%(MOD1);
    }   
    ll a,b,c,d;
    cin>>a>>b>>c>>d;
    ll t1 = qmi(a,m1-1,MOD1), t2;
    if(a==1)
        t2 = b*(m2-1)%MOD1;
    else    
        t2 = b*gp(a,m1-1)%MOD1;

    ll t3 = c * t1 %MOD1, t4 = (t1*d+t2)%MOD1;
    ll t5 = qmi(t3, n1-1,MOD1), t6;
    if(t3==1)
        t6 = t4*(n2-1)%MOD1;
    else    
        t6 = t4*gp(t3,n1-1);
    ll f1m = t1+t2;
    ll fnm = (t5*f1m+t6)%MOD1;
    cout<<fnm;
}
int main()
{
    io;
    int T=1,i_;
    // cin>>T;
    // for(i_=1;i_<=T;i_++)
    solve(i_);

    return 0;
}

标签:MOD1,begin,end,游戏,t2,ll,矩阵,aligned,4954
From: https://www.cnblogs.com/holycrap/p/17624795.html

相关文章

  • 联合省选 2023 填数游戏
    这是22年的我:https://www.luogu.com.cn/record/81067862这是23年的我:看我一个流过冲过A性质首先考虑判定。一个经典模型是:如果在\(T_{i,0}\)与\(T_{i,1}\)之间连一条无向边(若\(|T_i|=1\)则认为\(T_{i,1}=T_{i,0}\)),那么题目转化为给每条边定向,使得每个点的入度不超......
  • 矩阵游戏
    4954:矩阵游戏时间限制(普通/Java):2000MS/6000MS内存限制:65536KByte描述婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储)。她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][j]满足下......
  • [圣诞大礼]Macintosh苹果机精品游戏合集
    开篇:很多人求MBP...求到MBP问题马上就来了,mac苹果机上软件已经很不错了,PS、office、AutoCAD都有,问题有什么好游戏呢?年终给大家很多MAC苹果机游戏希望大家喜欢啊。感谢ZOD骑士lv_1_ss分流游戏说明一点:下面的游戏全部都是MAC原生游戏,非MAC原生游戏不做收录。全部游戏都是来源于苹果商店,所以应该不需要......
  • 猜数字小游戏
    #include<stdio.h>#include<stdlib.h>#include<time.h>voidmenu()//主菜单{printf("---1.开始游戏--------0.退出游戏----\n");}voidgame(){//1.生成一个随机数intret=0;intguess=0;ret=rand()%100+1;//生成1-100之间的随机数,随机数区间可以......
  • 代码随笔-某游戏网站数据的爬取
    importrequestsimportparselimportcsvimportre#将表头写入CSV文件withopen('xxxgame.csv',mode='a',encoding='utf-8-sig',newline='')asf:csv_writer=csv.DictWriter(f,fieldnames=['title','nu......
  • 恒创科技:游戏选香港主机会卡吗?
    ​经常会有用户问道:做游戏服务器,使用香港主机会很卡吗?要知道,游戏运营最看重的就是用户体验,而游戏流畅不流畅要看所使用香港服务器本身的稳定性。因此,卡不卡,这样的形式提问是比较笼统的,您应该从应用场景里出发考虑,今天我们就一起来解析一下。做游戏选中国香港服务器有什......
  • python猜数字小游戏
    importrandomdefguess_number():  target_number=random.randint(1,100)  attempts=0  whileTrue:    guess=int(input("请输入一个1到100之间的整数:"))    attempts+=1    ifguess<target_number:      print("猜......
  • 剑指 Offer 12. 矩阵中的路径(中等)
    题目:classSolution{public:introw,col;booltraversal(vector<vector<char>>&board,stringword,inti,intj,intk){//传入棋盘,字符串,当前棋盘元素坐标,字符串索引if(i<0||i>=row||j<0||j>=col||board[i][j]!=word[k])retu......
  • 五子棋游戏
    #include<iostream>#include<iomanip>inth=16;intl=16;boolis_black=true;intall_list[16][16];boolblack_list[16][16];boolwhile_list[16][16];intx;inty;usingnamespacestd;voidf5(){ for(inti=0;i<=h;i++){ cout<<setw(......
  • 数字游戏
    P1043[NOIP2003普及组]数字游戏首先考虑链的情况怎么做。发现就是划分\(m\)次,直接考虑类似于乘积最大的DP,复杂度为\(O(n^2m)\)。对于环的情况,只需要暴力考虑\(n\)种破环的方式,所以总复杂度为\(O(n^3m)\)。注意取模和数组清空。code......