日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF55D-Beautiful numbers【数位dp】

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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數的lcmlcmlcmkkk時的結果,當然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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。