NC219115. 暗号II
描述
long long gethash(string s) { long long hashsum = 0; for(int i=0; i<s.size(); i++) hashsum = (hashsum*base+s[i]-'a')%p; return hashsum; }
输入描述
第一行三个整数表示函数的参数,表示要求的长度。第二行一个字符串,用表示的长度,保证。
输出描述
输出与串值相同的字符串个数(如果的话,也包括它本身)。由于答案可能会很大,请对取模。
示例1
输入:
1 13 1 a
输出:
2
示例2
输入:
10 97 5 abb
输出:
122495
C++(clang++11) 解法, 执行用时: 470ms, 内存消耗: 16060K, 提交时间: 2021-03-24 10:11:22
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; const ll mod=1e9+7; ll dp[30][MAXN]; int main() { ll base,p; int n,i,j,k; scanf("%lld %lld %d",&base,&p,&n); string str; cin>>str; dp[0][0]=1; for(i=1;i<=n;i++){ for(j=0;j<=p-1;j++){ for(k=0;k<26;k++){ dp[i][(j*base+k)%p]+=dp[i-1][j]; dp[i][(j*base+k)%p]%=mod; } } } ll sum=0; for(i=0;i<str.length();i++){ sum=(sum*base+str[i]-'a')%p; } printf("%lld\n",dp[n][sum]); return 0; }