标签:pos ems 需要 bit class number its 不可 数位dp
求有 13且能被13整除的个数
显然已目前的四个状态无法对问题进行完全解答了 关于能否被13整除 有必要加一个mod状态
当pre为2的时候说明已经存在过13了(直接继承即可) 当pre为1说明前一个为1 当pre为0说明前一个不为0
当我这样做完发现还是一直错
增加了一维需要对dp数组也要增加 因为状态转移缺一不可!!!!!!!!!
这样就顺利ac了
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f #define N 10+5 ll dp[N][20][10]; ll a[N]; ll dfs(int pos,int pre,int mod,bool lead,bool limit) { if(!pos) { if(mod==0&&pre==2)return 1; else return 0; } if(!limit&&!lead&&dp[pos][mod][pre]!=-1)return dp[pos][mod][pre]; ll ans=0; int up=limit?a[pos]:9; rep(i,0,up) { if( (pre==1&&i==3) ||pre==2) ans+=dfs(pos-1,2,(mod*10+i)%13,lead&&i==0,limit&&i==a[pos]); else ans+=dfs(pos-1,i==1?1:0,(mod*10+i)%13,lead&&i==0,limit&&i==a[pos]); } if(!limit&&!lead)dp[pos][mod][pre]=ans; return ans; } ll solve(ll x) { int pos=0; while(x) { a[++pos]=x%10; x/=10; } return dfs(pos,0,0,true,true); } int main() { ll x; while(scanf("%lld",&x)==1) { CLR(dp,-1); printf("%lld\n",solve(x)); } return 0; }
标签:pos ems 需要 bit class number its 不可 数位dp
原文地址:https://www.cnblogs.com/bxd123/p/10714237.html