3653. 她的名字

单点时限: 4.0 sec

内存限制: 512 MB

“他走过一个又一个星球,
却始终放不下对她的思念。“
”深情终究是一趟孤独的旅程,
她是他永远的牵绊。”

在这里插入图片描述

我们每个人心中都有一只小狐狸。我们渴望被自己喜欢的人驯服。

爱情是彼此之间至为甜蜜的臣服。我们都是傻痴痴的小狐狸,徒具一副精明的外表。

就像你走到哪都挂念着她,想把她写进自己的歌里,成为你们共同的记忆。

你想从她全部由数字构成的名字里取出其中的 个数字,维持原来的顺序,组成结尾为数字 的新词。

你自然希望自己的歌能够很长很长,歌词的每一句都能饱含甜蜜。

所以你想知道,她的名字能够组成多少个长度为 且结尾为数字 的新词(如果从她名字中取出的任意一个数字位置不同,两个词就被认为是不同的)。

输入格式
第一行包含一个由数字构成的字符串 ()。

第二行包含一个整数 (),表示需要选择的不同结尾数量。

接下来的 行,每行包含了一个整数 () 和两个数字 ,用空格隔开,表示需要选择的歌词的长度和结尾。

输出格式
对于每一个询问,输出一个整数,表示答案。

答案可能会很大,你只需要输出对于 取模后的结果。

样例
input
312121
4
2 21
3 31
4 22
3 22
output
3
0
1
2
提示
样例中第一个询问:312121, 312121, 312121.

第二个询问:无。

第三个询问:312121.

思路:
ans[len][type]代表长度l,末尾是type的次数。
type从0-99打表。

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
 
ll C[2100][2100];
ll ans[2110][2110];
void cal(){
    for(int i=0;i<=2000;i++){
        C[i][0]=1;
    }
    for(int i=1;i<=2000;i++){
        for(int j=1;j<=i;j++){
            C[i][j]=(C[i-1][j]%MOD+C[i-1][j-1]%MOD)%MOD;
        }
    }
}
int main(){
    cal();
    string in;
    cin>>in;
    int len=in.size();
    for(int i=0;i<=9;i++){
        for(int j=0;j<=9;j++){
            ll cnt=0;
            for(int k=len-1;k>=0;k--){
                if(in[k]=='0'+j){
                    cnt++;
                }
                if(in[k]=='0'+i){
                    for(int l=2;l<=k+2;l++){
                        if(i==j){
                            ans[l][i*10+j]=(ans[l][i*10+j]+((cnt-1)*C[k][l-2])%MOD)%MOD;
                        }//这个特判是因为ij相同时就得少一个
                        else{
                            ans[l][i*10+j]=(ans[l][i*10+j]+(cnt*C[k][l-2])%MOD)%MOD;
                        }
                        //cout<<ans[l][i*10+j]<<"---"<<endl;
                    }
                }
            }
        }
    }
    int q;
    cin>>q;
    while(q--){
        int lens,type;
        cin>>lens>>type;
        if(lens<2||lens>len){
            cout<<0<<endl;
            continue;
        }
        cout<<ans[lens][type]<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值