【HDU 2604】Queuing

题意

  f和m两种字母组成字符串,fmf 和 fff 这种为不安全的字符串,现在有2*L个字母,问你有多少安全的字符串。答案mod M。

分析

  递推,这题本意是要用矩阵快速幂。不过我发现这题好神奇,只要适当的减少取模的次数,就可以水过去(呵呵呵)。

  当时做这题的时候用的是比较奇怪的递推式,然后超时了,但是两个两个地推也就水过去了(哈哈哈)。

  正确的递推方程:f(n)=f(n-1)+f(n-3)+f(n-4)。

  如果第n位是f,它前面是f时(ff),再前一位必须是m(mff),再前一位还必须是m(mmff),所以有f(n-4)种;

         它前面是m时(mf),再前一位必须是m(mmf),再前就任意了,所以有f(n-3)种

  第n位是m,它前面可以是任意的,所以有f(n-1)种。

  接下来是构造矩阵:

代码

矩阵快速幂代码(AC)

#include<stdio.h>
#include<string.h>
int k,m,t[5]={0,2,4,6,9};
struct matrix
{
    int a[15][15];
    int row,col;
    void init(int row,int col){
        this->row=row;
        this->col=col;
        memset(a,0,sizeof(a));
    }
}u;
struct matrix b{
    {{1,0,1,1},
     {1,0,0,0},
     {0,1,0,0},
     {0,0,1,0}},
    4,4
};
struct matrix c{
    {{9},{6},{4},{2}},
    4,1
};
matrix mul(matrix a,matrix b)
{
    matrix c;
    c.init(a.row,b.col);
    for(int i=0; i<a.row; i++)
        for(int j=0; j<b.col; j++)
            for(int k=0; k<a.col; k++)
                c.a[i][j]=(c.a[i][j]%m+a.a[i][k]*b.a[k][j]%m)%m;
    return c;
}

matrix qpow(matrix a,int k)
{
    matrix ans;
    ans.init(a.row,a.col);
    for(int i=0;i<a.row;i++)
        ans.a[i][i]=1;
    while(k)
    {
        if(k&1)ans=mul(ans,a);
        a=mul(a,a);
        k>>=1;
    }
    return ans;
}

int main()
{
    while(~scanf("%d%d",&k,&m))
    {
        if(k>4){u=mul(qpow(b,k-4),c);
        printf("%d\n",u.a[0][0]%m);}
        else printf("%d\n",t[k]%m);
    }
    return 0;
}

奇怪的姿势一个个推,去掉两个mod就水过去了(AC)

#include<stdio.h>
int l,m,mm,mf,ff,fm,ta,tb,tc,td;
int main()
{
    while(~scanf("%d%d",&l,&m))
    {
        if(l==1)printf("%d\n",2%m);
        else if(l==0)printf("0\n");
        else
        {
            mm=mf=fm=ff=1;
            for(int i=2; i<l; i++)
            {
                ta=mm;
                tb=mf;
                tc=fm;
                td=ff;
                mm=(tc+ta)%m;
                mf=ta;//mf=ta%m;
                fm=(tb+td)%m;
                ff=tb;//ff=tb%m;
            }
            printf("%d\n",(mm+mf+fm+ff)%m);
        }
    }
    return 0;
}

奇怪的姿势两个两个推(AC)

#include<stdio.h>
int l,m;
int mm,mf,fm,ff;
int mma,mfa,fma,ffa;
int i;
int main()
{
    while(~scanf("%d%d",&l,&m))
    {
        if(l==0)printf("0\n");
        else
        {
            if(l%2){
                i=1;
                mm=1;mf=1;fm=0;ff=0;
            }else{
                mm=mf=fm=ff=1;
                i=2;
            }
            for(; i<l; i+=2)
            {
                mma=mm,mfa=mf,fma=fm,ffa=ff;
                mm=(mfa+ffa+fma+mma)%m;
                mf=(fma+mma)%m;
                fm=(mma+mfa)%m;
                ff=mma%m;
            }
            printf("%d\n",(mm+mf+fm+ff)%m);
        }
    }
    return 0;
}

漂亮的直接推(AC)

M(1 <= M <= 30) ,所以只在计算到大于一个比较大的数时才取模,这样可以减少取模的次数。这是参考了别人的代码。

#include<stdio.h>

int l,m;
int f[1000005]={0,2,4,6,9};

int main()
{
    while(~scanf("%d%d",&l,&m))
    {
        for(int i=5;i<=l;i++){

            f[i]=f[i-1]+f[i-3]+f[i-4];

            if(f[i]>1000000)
                f[i]%=m;
        }
        printf("%d\n",f[l]%m);
    }
    return 0;
}
时间: 2024-10-10 10:36:30

【HDU 2604】Queuing的相关文章

【HDU 4940】Destroy Transportation system(数据水/无源无汇带上下界可行流)

Description Tom is a commander, his task is destroying his enemy’s transportation system. Let’s represent his enemy’s transportation system as a simple directed graph G with n nodes and m edges. Each node is a city and each directed edge is a directe

【HDU 1009】FatMouse&#39; Trade

题 Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean. The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of c

【HDU 5647】DZY Loves Connecting(树DP)

pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 332    Accepted Submission(s): 112 Problem Description DZY has an unroote

【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings

不容易啊,终于可以补第二个题了!! 顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错) 题目大意: 有一个n*m的矩阵,每一个格子里都将有一个数.给你每一行数字之和和每一列数字之和.求每一个位置能填0~k之间的哪个数.如果有多种可能输出"Not Unique",如果没有解输出"Impossible",如果一组解则将其输出. 解题思路: 最大流: 不可能的条件:是行之和和列之和不想等或者建图后的最大流与他们不想等. 多组的条件是:在最大流

【HDU 1839】 Delay Constrained Maximum Capacity Path(二分+最短路)

[HDU 1839] Delay Constrained Maximum Capacity Path(二分+最短路) Delay Constrained Maximum Capacity Path Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 1515    Accepted Submission(s): 481 Problem

【HDU 5828】Rikka with Sequence(线段树)

[HDU 5828]Rikka with Sequence(线段树) Rikka with Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2311    Accepted Submission(s): 391 Problem Description As we know, Rikka is poor at math.

【HDU 4352】 XHXJ&#39;s LIS (数位DP+状态压缩+LIS)

XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2422    Accepted Submission(s): 990 Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then careful

【HDU 5811】Colosseo(拓扑+输入优化)

[HDU 5811]Colosseo(拓扑+输入优化) Colosseo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 446    Accepted Submission(s): 98 Problem Description Mr. Chopsticks keeps N monsters, numbered from 1 to N.

【HDU 5145】 NPY and girls(组合+莫队)

pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 593    Accepted Submission(s): 179 Problem Description NPY's girlfriend blew him out!H