CF55D-Beautiful numbers【数位dp】
生活随笔
收集整理的這篇文章主要介紹了
CF55D-Beautiful numbers【数位dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/CF55D
題目大意
求[l,r][l,r][l,r]中有多少個數使得它可以被它的所有非000位整除。
解題思路
因為這些數的lcmlcmlcm一定是lcm(1,2,3,4,5,6,7,8,9,10)=2520lcm(1,2,3,4,5,6,7,8,9,10)=2520lcm(1,2,3,4,5,6,7,8,9,10)=2520的約數,所以我們只需要記錄這個數%2520\% 2520%2520的值即可,設fi,j,kf_{i,j,k}fi,j,k?表示到第iii位,這個數字%2520\% 2520%2520的值為jjj,當前非000數的lcmlcmlcm為kkk時的結果,當然kkk這一維要離散化。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define ll long long using namespace std; const ll P=2520; ll t,f[20][50][P],a[20],rev[P+10],cnt; ll gcd(ll x,ll y) {return (!y)?x:gcd(y,x%y);} ll dfs(ll x,ll lcm,ll v,bool sp){if(x<0)return (v%lcm==0);if(!sp&&f[x][rev[lcm]][v]>=0)return f[x][rev[lcm]][v];ll sum=0,lim=(sp==1)?a[x]:9;for(ll i=0;i<=lim;i++){if(!i)sum+=dfs(x-1,lcm,v*10%P,sp&(i==lim));else sum+=dfs(x-1,lcm*i/gcd(lcm,i),(v*10+i)%P,sp&(i==lim));}if(sp)return sum;return f[x][rev[lcm]][v]=sum; } ll get(long long x){ll i=0;if(!x)return 1;for(i=0;x;x/=10,i++)a[i]=x%10;return dfs(i-1,1,0,1); } int main() {cin>>t; memset(f,-1,sizeof(f));for(int i=1;i<=P;i++)if(P%i==0)rev[i]=++cnt;while(t--){ll l,r;cin>>l>>r;cout<<get(r)-get(l-1)<<endl;}return 0; }總結
以上是生活随笔為你收集整理的CF55D-Beautiful numbers【数位dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql8.0.11 安装顺序_mys
- 下一篇: MySQL的一些概念笔记