首页 > 代码库 > cf55dBeautiful numbers数位dp
cf55dBeautiful numbers数位dp
想到 最小公倍数 其余的就好搞了 ,可是没想到
#include <cstdio>#include <cstring>#include <algorithm>#include <climits>#include <string>#include <iostream>#include <map>#include <cstdlib>#include <list>#include <set>#include <queue>#include <stack>#include<math.h>using namespace std;typedef long long LL;const int mod=2520;LL dp[20][2520][1<<8];int up[20];LL dfs(int now,int pre,int gaojici,int flag){ if(now<=0){ for(int i=0;i<=7;i++) if((gaojici&(1<<i))&&pre%(i+2)) return 0; return 1; } if(!flag&&~dp[now][pre][gaojici]) return dp[now][pre][gaojici]; int limit = flag? up[now] : 9;LL ret=0 ; for(int i = 0;i<=limit;i++){ if(i>=2) ret+=dfs(now-1,(pre*10+i)%mod, gaojici|(1<<(i-2)) ,flag&&i==limit); else ret+=dfs(now-1,(pre*10+i)%mod, gaojici,flag&&i==limit); } return flag? ret: dp[now][pre][gaojici]= ret;}LL solve(LL x){ int len =0 ; while(x){ up[++len] = x%10; x/=10; } return dfs(len ,0, 0 , 1)-1;}int main(){ int Icase;LL a,b; scanf("%d",&Icase); memset(dp,-1,sizeof(dp)); for(int i = 1;i<=Icase;i++){ scanf("%I64d%I64d",&a,&b); printf("%I64d\n",solve(b) - solve(a-1)); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。