欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3653. 她的名字

程序员文章站 2022-06-23 18:06:14
...

单点时限: 4.0 sec

内存限制: 512 MB

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

3653. 她的名字

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

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

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

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

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

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

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

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

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

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

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

样例
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;
}