从未见过的船新版本数位dp,,省去了预处理过程,直接进行计算
#include<bits/stdc++.h> using namespace std; #define ll long long int dp[20][20][5],n,len,bit[20]; //dp[i][j][k]:到i位数,前面模13=j,前面是1|不是1|有13的状态已经确定,后面的数的个数 //mod:前面%13的余数,flag=0|1|2:pos+1位不是1|是1|有13出现过了,lim:数的限制 int dfs(int pos,int mod,int flag,int lim){ if(!lim && dp[pos][mod][flag]!=-1)//只有在无限制的情况下才能直接返回 return dp[pos][mod][flag]; if(pos<=0)return mod==0&&flag==2; int num,mod_x,flag_x,res=0; if(lim)num=bit[pos];else num=9; for(int i=0;i<=num;i++){ mod_x=(mod*10+i)%13; flag_x=flag; if(flag==0 && i==1)flag_x=1; if(flag==1 && i!=1)flag_x=0; if(flag==1 && i==3)flag_x=2; res+=dfs(pos-1,mod_x,flag_x,lim&&i==num); } if(!lim)dp[pos][mod][flag]=res; return res; } int main(){ while(cin>>n){ memset(bit,0,sizeof bit); memset(dp,-1,sizeof dp); len=0; while(n){bit[++len]=n%10;n/=10;} cout<<dfs(len,0,0,1)<<endl; } }
原文地址:https://www.cnblogs.com/zsben991126/p/10688699.html
时间: 2024-10-21 10:47:16