13 100 200 1000
1 1 2 2
求[1,n]内含有13且是%13==0的个数
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int n;
int dp[20][3][15];///dp[i][j][k] i:位数 j:状态 k:%13后的数
int num[20];
///0:不合法 1:1开头 2:合法
int new_s(int s,int d) {
if(s==2) return 2;
if(s==1&&d==3) return 2;
if(d==1) return 1;
return 0;
}
int dfs(int i,int s,int mod,bool e) {
if(i<=0) return s==2&&mod==0;
if(!e&&dp[i][s][mod]!=-1)return dp[i][s][mod];
int res=0;
int u=e?num[i]:9;
for(int d=0; d<=u; d++) {
int Mod=(mod*10+d)%13;
res+=dfs(i-1,new_s(s,d),Mod,e&&d==u);
}
return e?res:dp[i][s][mod]=res;
}
int main() {
//freopen("in.txt","r",stdin);
while(cin>>n) {
memset(dp,-1,sizeof dp);
memset(num,0,sizeof num);
int len=1;
while(n) {
num[len++]=n%10;
n/=10;
}
num[len]=0;
int ans=dfs(len-1,0,0,1);
cout<<ans<<endl;
}
return 0;
}原文地址:http://blog.csdn.net/acm_baihuzi/article/details/45222989