请问这题用递推公式怎么写?
查看原帖
请问这题用递推公式怎么写?
1122530
elpsconr楼主2024/9/19 00:27

题解好不容易看到一篇递推题解,用他的方法结果实现不了,求调

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rep_(i,a,b) for(int i=a;i>=b;--i)
#define all(x) x.begin(),x.end()
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl 
#define lc (rt<<1)
#define rc (rt<<1|1)
const int N=1e4+6,yyx=1e9+7;
vector<int> to[N];
int n,d,num[N];
int dp[N][115][2];//dp[i][j][k]表示的是前i位的数位和%d等于j,k表示是否小于上界的方案数
inline int mod(int x){
    return (x%yyx+yyx)%yyx;
}
inline void solve(){
  string k;
  cin>>k>>d;
  int len=k.size();
  rep(i,0,len-1) num[i]=k[len-i-1]-48;
  dp[0][0][0]=1;
  rep(i,0,len-1) rep(j,0,d-1) 
  rep(k,0,1) rep(now,0,9){
    if(!k&&now>num[i]) break;
    dp[i+1][(j+now)%d][k||now<num[i]]=mod(dp[i+1][(j+now)%d][k||now<num[i]]+dp[i][j][k]);
  }
  cout<<mod(dp[len][0][0]+dp[len][0][1]-1)<<endl;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  //cin>>_;
  while(_--)
  solve();
  return 0;
}
2024/9/19 00:27
加载中...