zoukankan      html  css  js  c++  java
  • P5196 [USACO19JAN]Cow Poetry

    题目背景

    USACO19年一月金组第一题

    题目描述

    不为Farmer John所知的是,Bessie还热衷于资助艺术创作!最近,她开始研究许多伟大的诗人们,而现在,她想要尝试创作一些属于自己的诗歌了。 Bessie认识N(1≤N≤5000)个单词,她想要将她们写进她的诗。Bessie已经计算了她认识的每个单词的长度,以音节为单位,并且她将这些单词划分成了不同的“韵部”。每个单词仅与属于同一韵部的其他单词押韵。

    Bessie的每首诗由M行组成(1≤M≤10^5),每一行必须由K(1≤K≤5000)个音节构成。此外,Bessie的诗必须遵循某个指定的押韵模式。

    Bessie想要知道她可以写出多少首符合限制条件的不同的诗。

    输入格式

    输入的第一行包含N、M和K。 以下N行,每行包含两个整数si(1≤si≤K)和ci(1≤ci≤N)。这表示Bessie认识一个长度(以音节为单位)为si、属于韵部ci的单词。

    最后M行描述了Bessie想要的押韵模式,每行包含一个大写字母ei。所有押韵模式等于ei的行必须以同一韵部的单词结尾。不同ei值的行并非必须以不同的韵部的单词结尾。

    输出格式

    输出Bessie可以写出的满足这些限制的不同的诗的数量。由于这个数字可能非常大,请计算这个数对1,000,000,007取余的结果。

    输入输出样例

    输入 #1
    3 3 10
    3 1
    4 1
    3 2
    A
    B
    A
    输出 #1
    960

    说明/提示

    在这个例子中,Bessie认识三个单词。前两个单词押韵,长度分别为三个音节和四个音节,最后一个单词长度为三个音节,不与其他单词押韵。她想要写一首三行的诗,每行包含十个音节,并且第一行和最后一行押韵。共有960首这样的诗。以下是一首满足要求的诗(其中1,2、3分别代表第一个、第二个、第三个单词):121 123 321。

    代码

    #include<bits/stdc++.h>
    #define mm 1000000007
    #define N 5007
    using namespace std;
    struct node{
        int s,c;
    }a[N];
    int f[N][N],b[27];
    inline int pp(int x,int k) {
        int s = 1;
        while(k) {
            if(k & 1) s = (1LL * s * x) % mm;
            x = (1LL * x * x) % mm;
            k >>= 1;
        }
        return s;
    }
    int main()
    {
        int n,m,k; char c;long long ans=0,res=1;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++) scanf("%d%d",&a[i].s,&a[i].c);
        for(int i=1;i<=m;i++){
            scanf("
    %c",&c);
            b[c-'A'+1]++;
        }
        f[0][0]=1;
        for(int i=0;i<=k;i++){
            for(int j=1;j<=n;j++){
                if(i+a[j].s<=k){
                    f[i+a[j].s][a[j].c]=(f[i][0]+f[i+a[j].s][a[j].c])%mm;
                    f[i+a[j].s][0]=(f[i][0]+f[i+a[j].s][0])%mm;
                }
            }
        }
        for(int i=1;i<=26;i++){
            if(!b[i]) continue;
            for(int j=1;j<=n;j++){
                if(f[k][j])
                    ans=(ans+pp(f[k][j],b[i]))%mm;
            }
            res=(1LL*ans*res)%mm;ans=0;
        }
        printf("%lld",res);
        return 0;
    }
  • 相关阅读:
    Go 语言基础知识
    Docker 配置代理
    Kubernetes StatefulSets
    Kubernetes Storage
    Centos7.4 Nginx反向代理+负载均衡配置
    LVS 负载均衡原理详解
    Kubernetes Ingress
    Kubernetes Endpoints
    kubernetes 核心对象
    K8s ipvs mode kube-proxy
  • 原文地址:https://www.cnblogs.com/wangyiding2003/p/11569108.html
Copyright © 2011-2022 走看看