Gym 100623J Just To Lucky(數位dp)
阿新 • • 發佈:2019-02-20
題意:1-n中有多少個數滿足本身能被各個數位的和整除;
思路:n是10的12次方,很快就能想到是數位dp,當時沒板子,忘了數位dp怎麼敲了,後來看了下題解,還是挺裸的數位dp。
dp[pos][sum][remain][mod];
pos:代表當前數位
sum:各數位之和
remain:當前列舉的數
mod:列舉的膜
9*12=108,所以只要列舉1-108即可;
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; int a[15]; int dp[15][110][110][110]; ll dfs(int pos,int sum,int mod,int remain,bool limit) { if(!pos) return sum==mod&&remain==0; if(dp[pos][sum][remain][mod]!=-1&&!limit) return dp[pos][sum][remain][mod]; int up = limit ? a[pos] : 9; ll ans = 0; for(int i = 0; i <= up; i++) { ans += dfs(pos-1,sum+i,mod,(remain*10+i)%mod,limit&&i==up); } if(!limit) dp[pos][sum][remain][mod] = ans; return ans; } void solve(ll t) { int len = 0; while(t) { a[++len] = t%10; t /= 10; } ll ans = 0; for(int i = 1; i <= 108; i++) { ans += dfs(len,0,i,0,true); } cout<<ans<<endl; } int main() { //freopen("just.in","r",stdin); //freopen("just.out","w",stdout); ll m; memset(dp,-1,sizeof(dp)); cin >> m; solve(m); return 0; }