hdoj3652 B-number
题意:给出n,问1-n中有13且能整除13的数数量。
就是hd3555和codeforces beautiful number的合成版。dp记录待填长度,是否带有13,前面数的模13余数,前一个数是k的时候的b-number数数量。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> using namespace std; const double EPS=1e-8; const int SZ=5050,INF=0x7FFFFFFF; typedef long long lon; int dp[20][15][10][2]; int dfs(int pos,int sum,int pre,int limit,string &str,int inc) { if(pos==str.size())return inc&&(sum%13==0); if(!limit&&dp[str.size()-pos-1][sum][pre][inc]!=-1)return dp[str.size()-pos-1][sum][pre][inc]; int up=limit?str[pos]-'0':9; int res=0; for(int i=0;i<=up;++i) { int nexsum=(sum*10+i)%13; if(pre==1&&i==3)res+=dfs(pos+1,nexsum,i,limit&&i==str[pos]-'0',str,1); else res+=dfs(pos+1,nexsum,i,limit&&i==str[pos]-'0',str,inc); //if(pos==1&&pre==1)cout<<i<<" "<<res<<" "<<endl; } if(!limit)dp[str.size()-pos-1][sum][pre][inc]=res; return res; } int work(string &str) { return dfs(0,0,0,1,str,0); } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); //lon casenum; //cin>>casenum; memset(dp,-1,sizeof(dp)); //for(lon time=1;time<=casenum;++time) string str; for(lon time=1;cin>>str;++time) { cout<<work(str)<<endl; } return 0; }