codeforces 55d//Beautiful numbers// Codeforces Beta Round #51
Posted gaudar
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 55d//Beautiful numbers// Codeforces Beta Round #51相关的知识,希望对你有一定的参考价值。
题意:一个数能整除它所有的位上的数字(除了0),统计这样数的个数。
注意离散化,为了速度更快需存入数组查找。
不要每次memset,记录下已有的长度下符合条件的个数。
数位dp肯定是从高位到低位。
记录数字已经有多大,还有lcm,递归传下去。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> using namespace std; const double EPS=1e-8; const int SZ=5050,INF=0x7FFFFFFF; typedef long long lon; lon dp[20][3000][50],index[3000];//2520 vector<lon> ls; lon gcd(lon x,lon y) { if(x<y)swap(x,y); for(;;) { lon rem=x%y; if(rem==0)return y; x=y; y=rem; } } lon lcm(lon x,lon y) { return x*y/gcd(x,y); } void getid() { for(lon i=0;i<ls.size();++i) { index[ls[i]]=i; } } void lsh() { for(lon i=1;i<pow(2,10);++i) { lon cur=1; for(lon j=0;j<9;++j) { if(i&(1<<j))cur=lcm(cur,j+1); } ls.push_back(cur); } sort(ls.begin(),ls.end()); ls.erase(unique(ls.begin(),ls.end()),ls.end()); getid(); } lon dfs(lon pos,lon cur,lon prelcm,lon limit,string &str) { if(pos==str.size())return cur%prelcm==0; if(!limit&&dp[str.size()-pos-1][cur][index[prelcm]]!=-1)return dp[str.size()-pos-1][cur][index[prelcm]]; lon res=0; lon up=limit?str[pos]-‘0‘:9; for(lon i=0;i<=up;++i) { lon curlcm=prelcm; if(i)curlcm=lcm(i,curlcm); res+=dfs(pos+1,(cur*10+i)%2520,curlcm,limit&&str[pos]-‘0‘==i,str); } if(!limit)dp[str.size()-pos-1][cur][index[prelcm]]=res; return res; } lon work(string &str) { return dfs(0,0,1,1,str); } bool chk(string &str) { lon num=0,curlcm=1; for(lon i=0;i<str.size();++i) { num=(num*10+str[i]-‘0‘)%2520; if(str[i]!=‘0‘)curlcm=lcm(curlcm,str[i]-‘0‘); } return num%curlcm==0; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\1.txt","r",stdin); lon casenum; cin>>casenum; lsh(); memset(dp,-1,sizeof(dp)); for(lon time=1;time<=casenum;++time) { string ll,rr; cin>>ll>>rr; lon res=work(rr)-work(ll); if(chk(ll))++res; cout<<res<<endl; } return 0; }
以上是关于codeforces 55d//Beautiful numbers// Codeforces Beta Round #51的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 56 D - Beautiful Graph
Codeforces 1093D. Beautiful Graph二分图染色+组合数
cf55D. Beautiful numbers(数位dp)