ZOJ 3690 Choosing number(矩阵快速幂)

题目地址:ZOJ 3690

假设F(n)表示前n个人第n个人选择的数大于k的个数,G(n)表示的是前n个人第n个人选择的数小于等于k的个数

那么F(n) = F(n-1)*(m-k)+G(n-1)*(m-k) , G(n) = F(n-1)*k+G(n-1)*(k-1) , 那么最后的结果就是F(n)+G(n);

那么我们可以构造出矩阵

| m-k m-k|   | F(n-1) |       | F(n) |

| k      k-1| * | G(n-1) | => | G(n) |

那么初始值F(1) = m-k , G(1) = k

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL long long

using namespace std;
const LL mod=1e9+7;
struct matrix
{
    LL ma[3][3];
}init,res;
matrix Mult(matrix x, matrix y)
{
    matrix tmp;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            tmp.ma[i][j]=0;
            for(int k=0;k<2;k++)
            {
                tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;
            }
        }
    }
    return tmp;
}
matrix Pow(matrix x, int k)
{
    matrix tmp;
    int i, j;
    for(i=0;i<2;i++) for(j=0;j<2;j++) tmp.ma[i][j]=(i==j);
    while(k)
    {
        if(k&1) tmp=Mult(tmp,x);
        x=Mult(x,x);
        k>>=1;
    }
    return tmp;
}
int main()
{
    int n, m, k, i, j;
    LL ans;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        init.ma[0][0]=m-k;
        init.ma[0][1]=m-k;
        init.ma[1][0]=k;
        init.ma[1][1]=k-1;
        res=Pow(init,n-1);
        ans=((m-k)*res.ma[0][0]+k*res.ma[0][1]+(m-k)*res.ma[1][0]+k*res.ma[1][1])%mod;
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-11-05 21:35:00

ZOJ 3690 Choosing number(矩阵快速幂)的相关文章

ZOJ - 3690 Choosing number 矩阵快速幂

题目大意:有n个人排成一行,有m个数字,每个人可以选择1 – m的任一个数字,但有一个限制,如果相邻的两个人选择相同的数字的话,这个数字必须大于k 问有多少种选择方法 解题思路:变化矩阵为(m-k, k, m - k, k - 1),按行的写 设前一个数为j 如果j大于k的话,那么j后面可以跟上任一个数 如果j小于等于k,那么j后面只能跟上不等于k的数 如果有p种情况为前一个数大于k的,q种情况为前一个数小于等于k的,由上面可得,当前这个数大于k的情况有 p * (n -k) + q * (n

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 Choosing number(dp矩阵优化)

Choosing number Time Limit: 2 Seconds      Memory Limit: 65536 KB There are n people standing in a row. And There are m numbers, 1.2...m. Every one should choose a number. But if two persons standing adjacent to each other choose the same number, the

ZOJ 3497 Mistwald(矩阵快速幂)

题目: Mistwald Time Limit: 2 Seconds      Memory Limit: 65536 KB In chapter 4 of the game Trails in the Sky SC, Estelle Bright and her friends are crossing Mistwald to meet their final enemy, Lucciola. Mistwald is a mysterious place. It consists of M *

HDU 6198 number number number 矩阵快速幂 找规律

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6198 题目描述: 给你一个k, 你可以用K个斐波那契数列中的数来构造一个数, 现在我们要求构造不出来的那个最小的数字 解题思路: 首先我们把斐波那契数列写出来, 0, 1, 1, 2, 3, 5, 8, 13, 21, 43 . . . . . . , 我们首先发现当K == 1 的时候构造不出来的数显然是4, 然后2个的时候是12, 三个是33, 然后找规律就是 f(2*n+3)-1 .....

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 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 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

zoj3690--Choosing number(dp,矩阵快速幂)

Choosing number Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description There are n people standing in a row. And There are m numbers, 1.2...m. Every one should choose a number. But if two persons standing