码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 55d-----状压dp and math

时间:2018-10-07 22:03:23      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:spl   sizeof   type   problem   ini   art   范围   hash   dfs   

先贴一下题目链接:  https://vjudge.net/problem/CodeForces-55D

题意大致如下:        给t次询问,       每次询问给出一段区间【l,r】   要你求出这段区间中的beautiful number

漂亮数定义如下:     一个数如果为漂亮数   是它可以  被它的非零数位  整除!

然后贴一下别人的题解::::::::::::https://blog.csdn.net/Rain722/article/details/54709913

首先可以确认一点   1: 如果一个数可以被多个数整除,   ((那么最重要的一点是先找出这个数的lcm))!

                                 2:可以得出1到9这9个数的lcm是2520  (暴力算一下就可以)

                                 3:显然在数位上的操作一般都是数位dp

                                 4:可以确定一点,   <<pos(也就是数位肯定是第一维状态)>>,那怎么唯一确定它的状态了     我们想既然找整除的数那么最终是找   余数/lcm==0,那么状态就可以划分成   数位,,,余数,,,,lcm,,,,,,,      然后余数的范围可以限制到2520,lcm由于限制它只有50个数:::::::::

那么就可以推出了!

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int mod=2520;
 5 int t;
 6 LL l,r;
 7 LL dp[25][50][2550];  // 数位  lcm  余数 
 8 int Hash[2550];  //把lcm   hash出来 
 9 int bit[25];
10 
11 LL gcd(LL a,LL b){
12     if(b==0) return a;
13     else return gcd(b,a%b);
14 }
15 
16 void init(){
17     int cnt=0;
18     for(int i=1;i<=mod;i++)
19         if(mod%i==0)
20            Hash[i]=cnt++;      
21 }
22 
23 LL dfs(int pos,int have,int lcm,int lim){
24     if(pos<=0) return have%lcm==0;
25     if(!lim&&dp[pos][Hash[lcm]][have]!=-1) return dp[pos][Hash[lcm]][have];
26     int num=lim?bit[pos]:9;
27     LL ans=0;
28     for(int i=0;i<=num;i++){
29         ans+=dfs(pos-1,(have*10+i)%mod,i==0?lcm:lcm*i/gcd(lcm,i),lim&&i==num);
30     }
31     if(!lim) dp[pos][Hash[lcm]][have]=ans;
32     return ans;
33 }
34 LL solve(LL m){
35    int len=0;
36    while(m){
37            bit[++len]=m%10;m/=10;
38    }
39    return dfs(len,0,1,1);    
40 }
41 
42 int main(){
43     init();
44     scanf("%d",&t);
45     memset(dp,-1,sizeof(dp));   //dp数组初始化 
46     while(t--){
47         scanf("%lld%lld",&l,&r);
48         printf("%lld\n",solve(r)-solve(l-1));
49     }
50     return 0;
51 }
View Code

 一个不错的链接:::::https://www.cnblogs.com/vongang/p/3141273.html

Codeforces 55d-----状压dp and math

标签:spl   sizeof   type   problem   ini   art   范围   hash   dfs   

原文地址:https://www.cnblogs.com/pandaking/p/9751638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!