CodeForces 55D Beautiful numbers(数位dp)
2016-08-26 12:21
274 查看
数位dp好久没写了都忘了,这题是要这个数被它每一位中非0的数字整除
如果你不求出整个数字,就不知道他出现了哪几个数字,而且也存不下这一整个数字,怎么办
1−9的lcm=2520,所以可以先把数字模2520,然后再记录出现数字的lcm
最后看模2520的余数能不能整除那个lcm
但是dp[20][2520][2520]也开不下,怎么办呢
1−9的所有lcm搭配一共就48种,所以,可以把后面的模数改成第几个lcm
状态就变成了dp[20][2520][50]
代码:
如果你不求出整个数字,就不知道他出现了哪几个数字,而且也存不下这一整个数字,怎么办
1−9的lcm=2520,所以可以先把数字模2520,然后再记录出现数字的lcm
最后看模2520的余数能不能整除那个lcm
但是dp[20][2520][2520]也开不下,怎么办呢
1−9的所有lcm搭配一共就48种,所以,可以把后面的模数改成第几个lcm
状态就变成了dp[20][2520][50]
代码:
#include <map> #include <set> #include <ctime> #include <stack> #include <queue> #include <cmath> #include <bitset> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker,"/STACK:102400000,102400000") using namespace std; #define MAX 2050 #define MAXN 1000005 #define maxnode 205 #define sigma_size 26 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; const double pi = acos(-1.0); const double inf = 1e18; const double eps = 1e-4; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ int a[20]; LL dp[20][2525][55]; int tmp[5005]; int num; int gcd(int a,int b){ if(!b) return a; return gcd(b,a%b); } int lcm(int a,int b){ return a*b/gcd(a,b); } LL dfs(int len,int mo,int nu,int fp){ if(len==0) return mo%tmp[nu]==0; if(!fp&&dp[len][mo][nu]!=-1) return dp[len][mo][nu]; LL ans=0; int cnt=fp?a[len]:9; for(int i=0;i<=cnt;i++){ int ret; if(i) ret=lcm(i,tmp[nu]); else ret=tmp[nu]; int j; for(j=0;j<num;j++){ if(tmp[j]==ret) break; } ans+=dfs(len-1,(mo*10+i)%2520,j,fp&&(i==cnt)); } if(!fp) dp[len][mo][nu]=ans; return ans; } LL solve(LL x){ int len=0; while(x){ a[++len]=x%10; x/=10; } return dfs(len,0,0,1); } void init(){ num=0; for(int i=1;i<10;i++){ int k=num; for(int j=0;j<k;j++){ tmp[num++]=lcm(i,tmp[j]); } tmp[num++]=i; } sort(tmp,tmp+num); num=unique(tmp,tmp+num)-tmp; //cout<<num; } int main(){ int t; cin>>t; init(); mem(dp,-1); while(t--){ LL l,r; cin>>l>>r; cout<<solve(r)-solve(l-1)<<endl; } return 0; }
相关文章推荐
- Codeforces 855E Salazar Slytherin's Locket(数位dp)
- CodeForces 258B Little Elephant and Elections 数位DP
- codeforces 628D 数位dp
- [数位DP AC自动机] Codeforces 434C Round #248 (Div. 1) C. Tachibana Kanade's Tofu
- Codeforces-55D Beautiful numbers (数位DP)
- Codeforces 914C (数位dp)
- CodeForces 55D Beautiful numbers(数位dp)
- CodeForces-55D - Beautiful numbers - 数位DP
- CodeForces 55D Beautiful numbers (数位DP)
- 【数位DP】 Codeforces 55D Beautiful numbers
- 【数位dp?】CodeForces 288E Polo the Penguin and Lucky Numbers
- Codeforces 55D Beautiful numbers 数位dp(入门
- codeforces 628D Magic Numbers (数位dp)
- codeforces 55d A.Beautiful numbers 数位DP -
- codeforces--55D--Beautiful numbers(数位dp,dfs+记忆化)
- codeforces 55D. Beautiful numbers (数位dp)
- codeforces 908G - New Year and Original Order 数位dp
- codeforces 204A Little Elephant and Interval (数位dp)
- Codeforces 55D Beautiful numbers(数位dp)
- Codeforces edu 8 D. Magic Numbers 数位dp