华东交通大学2017年ACM“双基”程序设计竞赛 1005

Problem Description

假设你有一个矩阵,有这样的运算A^(n+1) = A^(n)*A (*代表矩阵乘法)
现在已知一个n*n矩阵A,S = A+A^2+A^3+...+A^k,输出S,因为每一个元素太大了,输出的每个元素模10

Input

先输入一个T(T<=10),每组一个n,k(1<=n<=30, k<=1000000)

Output

输出一个矩阵,每个元素模10(行末尾没有多余空格)

Sample Input

1
3 2
0 2 0
0 0 2
0 0 0

Sample Output

0 2 4
0 0 2
0 0 0

解法:矩阵的等比求和,知道这个就用模版写
#include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
#define LL long long
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N= 30 +9;
struct Matrix
{
    int m[N][N];
};
Matrix I;
int n,k,M;

Matrix add(Matrix a,Matrix b)
{
    Matrix c;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            c.m[i][j]=(a.m[i][j]+b.m[i][j])%M;
    return c;
}

Matrix multi(Matrix a,Matrix b)
{
    Matrix c;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            c.m[i][j]=0;
            for(int k=0;k<n;k++)
                c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%M;
        }
    }
    return c;
}
Matrix power(Matrix A,ll n)
{
    Matrix ans=I;
    while(n){
        if(n&1)
            ans=multi(ans,A);
        A=multi(A,A);
        n>>=1;
    }
    return ans;
}

Matrix sum(Matrix A,ll k)
{
    if(k==1) return A;
    Matrix t=sum(A,k/2);
    Matrix cur=power(A,k/2+(k&1));
    t=add(t,multi(t,cur));
    if(k&1) t=add(t,cur);
    return t;
}

int main()
{
    int T;
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    while(cin>>T){
        while(T--){
            cin>>n>>k;
            M=10;
            Matrix A;
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    cin>>A.m[i][j];
                    A.m[i][j]%=M;
                }
                I.m[i][i]=1;
            }
            Matrix ans=sum(A,k);
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(j+1!=n) cout<<ans.m[i][j]<<" ";
                    else cout<<ans.m[i][j]<<endl;
                }
            }
        }
    }
    return 0;
}
时间: 2024-11-06 03:34:51

华东交通大学2017年ACM“双基”程序设计竞赛 1005的相关文章

华东交通大学2017年ACM“双基”程序设计竞赛 1003

Problem Description 有两个球在长度为L的直线跑道上运动,两端为墙.0时刻小球a以1m/s的速度从起点向终点运动,t时刻小球b以相同的速度从终点向起点运动.问T时刻两球的距离.这里小球与小球.小球与墙的碰撞均为弹性碰撞,所有过程没有能量损失. Input 先输入一个q,代表q组数据,然后每组3个整数 L,t,T.1<=L<=1000;0<=t<=1000;t<=T<=1000; Output 一个整数,代表答案. Sample Input 2 10 4

华东交通大学2017年ACM“双基”程序设计竞赛

大吉大利今晚吃鸡 Problem Description 最近流行吃鸡,那就直接输出一行"Winner winner ,chicken dinner!"(没有双引号)模板代码:#include <stdio.h>int main(){printf("hello world\n");return 0;} Input 没有输入 Output 输出一行"Winner winner ,chicken dinner!"注意要换行 Sample

华东交通大学2017年ACM“双基”程序设计竞赛 1009

Problem Description MDD随机生成了n(n<le5)个随机数x(x<=1e9),这n个随机数排成一个序列,MDD有q(q<=le5)个询问,每个询问给你一个a,问你这个序列中有多少个区间的最大公约数不为a Input 第一行输入一个T,表示T组测试样例每组样例包含一个n,表示n个随机数再输入一个Q,表示Q个询问每个询问输入一个a Output 每个询问输出有多少个区间的gcd不为a Sample Input 1 5 1 2 4 4 1 4 1 2 3 4 Sample

华东交通大学2017年ACM“双基”程序设计竞赛 1002

Problem Description 一天YZW参加了学校组织交际舞活动,活动的开始活动方分别给男生和女生从1-n进行编号,按照从小到大顺时针的方式进行男女搭档分配,相同编号的男女组合成一对,例如一号男生与一号女生配对,以此类推.可是YZW对其中一个小姐姐一见钟情,于是机智的他向管理员提出了两种操作1.在这种情况下,管理员会给出移动的方向和大小,然后所有的男生向着这个方向移动x个位置.2.管理员会把相邻的奇数和偶数位置上的男生互换.在其中女生的位置是不会变的.可是YZW不知道经过这些Q次操作后

华东交通大学2017年ACM“双基”程序设计竞赛 1010

Problem Description 定义操作:将数 n 变为 f(n) = floor(sqrt(n)).即对一个数开平方后,再向下取整.如对 2 进行一次操作,开平方再向下取整, 1.414213562..... = 1 , 即变为了 1 .现在给出一个数 n,如果能在 5 次操作内把 n 变为 1,则输出操作次数:如果则超过5次输出"QAQ".数据范围:1<= n <= 10^100 Input 多组输入,每行输入一个数 n. Output 每组数据输出要多少次操作

华东交通大学2017年ACM“双基”程序设计竞赛 1001

Problem Description 最近流行吃鸡,那就直接输出一行"Winner winner ,chicken dinner!"(没有双引号)模板代码:#include <stdio.h>int main(){printf("hello world\n");return 0;} Input 没有输入 Output 输出一行"Winner winner ,chicken dinner!"注意要换行 Sample Output Wi

华东交通大学2015年ACM“双基”程序设计竞赛1005

Problem E Time Limit : 3000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 357   Accepted Submission(s) : 16 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 给定一个长度为n的数组 a[1],a[2],a[3]

华东交通大学2018年ACM“双基”程序设计竞赛 C. 公式题 (2) (矩阵快速幂)

题目链接:公式题 (2) 比赛链接:华东交通大学2018年ACM"双基"程序设计竞赛 题目描述 令f(n)=2f(n-1)+3f(n-2)+n,f(1)=1,f(2)=2 令g(n)=g(n-1)+f(n)+n*n,g(1)=2 告诉你n,输出g(n)的结果,结果对1e9+7取模 输入描述: 多组输入,每行一个整数n(1<=n<=1e9),如果输入为0,停止程序. 输出描述: 在一行中输出对应g(n)的值,结果对1e9+7取模. 示例1 输入 1 5 9 456 0 输出

华东交通大学2015年ACM“双基”程序设计竞赛1004

Problem D Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 945   Accepted Submission(s) : 121 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 阿黄的银行最近有发行了一种新面额的钞票面值为4,所