ZOJ 2974 矩阵快速幂

题意 给出n个杯子与初始其中有多少水 “同时”进行如下指令 将其中的水同时分入所指定的杯子 进行x次后 输出杯子剩余水量

队友想出应该是一道快速幂 但并不是过去的用初始杯子的水组成的矩阵乘某个矩阵

可以假想 我们同时拿出所有的水 然后按照要求以一个比例分入要求的杯子

那么 设置基数矩阵c[i][k] 那么beizi[i]=初始杯子[k]*c[i][k] i:1~n k:1~n 等式中的c矩阵是经过快速幂乘后的矩阵

然而。。很幸福的wa了。。

后来队友重打 发现了一个错误:当轮到设置某个杯子的指令时 如果a[i].n==0 即我们根本就不拿出这个杯子的水进行分配 它的c[i][i]初始为1

队友的代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
struct JZ {
    double a[25][25];
} init, unit;
int n;
JZ multi(JZ x, JZ y) {
    JZ z;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            z.a[i][j] = 0.0;
            for (int k = 0; k < n; k++) {
                z.a[i][j] += (x.a[i][k] * y.a[k][j]);
            }
        }
    }
    return z;
}
JZ Pow(JZ x, JZ y, int k) {
    while (k) {
        if (k % 2 != 0)
            y = multi(y, x);
        x = multi(x, x);
        k /= 2;
    }
    return y;
}
void init_JZ(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            init.a[i][j] = 0.0;
            unit.a[i][j] = 0.0;
        }
    }
}
double aa[25];
int main() {
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        init_JZ(n);
        for(int i=0;i<n;i++)
            scanf("%lf",&init.a[0][i]);
        int tmp=0,xh;
        for(int i=0;i<n;i++){
            scanf("%d",&tmp);
            if(tmp==0)
                unit.a[i][i]=1;
            else{
            for(int j=0;j<tmp;j++){
                scanf("%d",&xh);
                unit.a[i][xh-1]+=1.0/tmp;
            }}
        }

        int time;
        scanf("%d",&time);

        JZ res=Pow(unit,init,time);
        for(int i=0;i<n;i++){
            printf("%.2f",res.a[0][i]);
            printf(i==n-1?"\n":" ");
        }

    }
}

  

  

时间: 2024-11-10 08:36:09

ZOJ 2974 矩阵快速幂的相关文章

zoj 3960(矩阵快速幂)

题意:有n个人坐成一排,每个人从1-m中选出一个数字,只有一个规则,如果相邻两个人选出的数字相同,这个数字必须大于等于k(k <= m),问n个人选数字一共有多少种方法. 题解:需要递推,定义一个数组f[i]表示要放第i个数字大于等于k的方法数,g[i]表示要放第i个数字小于k的方法,结果当然就是f[n] + g[n]. f[i] = f[i - 1] * (m - k) + g[i - 1] * (m - k) g[i] = f[i - 1] * k + g[i - 1] * (k - 1)

zoj 2974 Just Pour the Water矩阵快速幂

Just Pour the Water Time Limit: 2 Seconds      Memory Limit: 65536 KB Shirly is a very clever girl. Now she has two containers (A and B), each with some water. Every minute, she pours half of the water in A into B, and simultaneous pours half of the

【ZOJ 2974】Just Pour the Water(矩阵快速幂)

传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2974 题意 给出n个杯子与初始水量同时进行操作 将其中的水同时平均分入所指定的杯子 进行x次后 输出杯子剩余水量 刚拿到这个题,第一反应是递推找规律,但是因为每个杯子的初始水量是未知的,所以能找的只是每个杯子水量与其余杯子水量的关系. 但是看到了操作次数巨大,而且最多只有20个杯子,感觉可以用快速幂去做. 我们假设矩阵a[i][j]代表第i个杯子的水有a[i][j

zoj 2853 Evolution(矩阵快速幂)

Evolution is a long, long process with extreme complexity and involves many species. Dr. C. P. Lottery is currently investigating a simplified model of evolution: consider that we haveN (2 <= N <= 200) species in the whole process of evolution, inde

ZOJ 3690 &amp; HDU 3658 (矩阵快速幂+公式递推)

ZOJ 3690 题意: 有n个人和m个数和一个k,现在每个人可以选择一个数,如果相邻的两个人选择相同的数,那么这个数要大于k 求选择方案数. 思路: 打表推了很久的公式都没推出来什么可行解,好不容易有了想法结果WA到天荒地老也无法AC.. 于是学习了下正规的做法,恍然大悟. 这道题应该用递推 + 矩阵快速幂. 我们设F(n) = 有n个人,第n个人选择的数大于k的方案数: G(n) = 有n个人,第n个人选择的数小于等于k的方案数: 那么递推关系式即是: F(1)=m?k,G(1)=k F(n

ZOJ 2794 Just Pour the Water 【矩阵快速幂】

给你n个杯子,每次有特定的到水规则,倒m次请问最后每个被子里还有多少水 我们很容易发现每次变化的规则相同,那么可以set 一个矩阵存放 然后多次倒水就相当于矩阵相乘,在m 范围达到(1<= M <= 1,000,000,000) 的情况下使用矩阵快速幂再好不过 这到题目注意的一点是,得使用Double 变量,如果使用FLoat会导致Wrong Answer Source Code: //#pragma comment(linker, "/STACK:16777216") /

zoj 3538 Arrange the Schedule(矩阵快速幂)

Arrange the Schedule Time Limit: 1 Second      Memory Limit: 65536 KB In Summer 2011, the ZJU-ICPC Team has a n-days training schedule. ZJU-ICPC Team has been divided into 4 Group: Akiba, BiliBili, CIA, Double(Group A, B, C, D). There is a group in c

ZOJ 2105 Number Sequence(矩阵快速幂)

题意: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给定A,B,求f(n). 法一: 网上较多的题解都提到了寻找1 1循环节的方法,的确非常巧妙,每位0~6,共7种可能,相邻两位共49种可能,因此循环周期至多为49,一旦出现相同数对,那么其后必相同.但是,该方法只是简单提及了49,却并没有证明1 1循环节一定存在,没有排除可能前面一段不循环,后面一段开始周期性循环的可能性.(是我悟性太差吗,为什么大多数题解都只谈

ZOJ 3256 Tour in the Castle 矩阵快速幂加速

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3256 题意:给一个n*m的棋盘,求从左上到左下的经过所有格子的方案数 在左边加一列问题就变成了求回路 由于m很大,所以我们需要按列dp 构造出矩阵后,用矩阵快速幂加速 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include&l