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