CodeForces 55D 數位DP
題意:求區間內的數字是每一位的倍數的數的數量
思路:加的狀態是當前取餘2520的餘數,因為2520是1到9的最小公倍數,然後還有一個狀態就是1到9都有哪些數出現了,可以用狀態壓縮來完成,然後最後就判斷餘數和出現的所有1到9的數是不是都取餘為0即可
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3fll; const int maxn=5010; const int mod=2520; int dig[30],f[20]; ll dp[20][2530][260]; bool judge(int sum,int num){ for(int i=2;i<=9;i++){ if(sum>>(i-2)&1){ if(num%i!=0) return 0; } } return 1; } ll dfs(int pos,int lim,int num,int sum){//num為餘數,sum為狀態壓縮 if(pos<0) return judge(sum,num); if(!lim&&dp[pos][num][sum]!=-1) return dp[pos][num][sum]; int las=lim?dig[pos]:9; ll ret=0; for(int i=0;i<=las;i++){ int tmp=sum; if(i>=2){ if(sum>>(i-2)&1) tmp=sum; else tmp+=(1<<(i-2)); } ret+=dfs(pos-1,lim&&(i==las),(num*10+i)%mod,tmp); } if(!lim) dp[pos][num][sum]=ret; return ret; } ll slove(ll n){ if(n==0) return 1; int len=0; while(n){ dig[len++]=n%10; n/=10; } return dfs(len-1,1,0,0); } int main(){ memset(dp,-1,sizeof(dp)); int T,cas=1; ll n,m; // cout<<slove(9)<<"=="<<endl; while(scanf("%d",&T)!=-1){ while(T--){ scanf("%I64d%I64d",&n,&m); printf("%I64d\n",slove(m)-slove(n-1)); } } return 0; }
相關推薦
CodeForces 55D 數位DP
題意:求區間內的數字是每一位的倍數的數的數量 思路:加的狀態是當前取餘2520的餘數,因為2520是1到9的最小公倍數,然後還有一個狀態就是1到9都有哪些數出現了,可以用狀態壓縮來完成,然後最後就判斷餘數和出現的所有1到9的數是不是都取餘為0即可#include <
codeforces 628D 數位dp
題意是給你兩個長度相等的串,長度為n,求兩串間滿足條件的串的個數。一個串滿足條件當且僅當奇數位不為d,偶數為為d,且串對應的數字可以被m整除。 很典型的數位dp。手殘調了一個小時…老是忘掉取模 思路:dp[i][j][1]表示前i位形成的數字,模m為j,且到
Shovel Sale CodeForces - 899D (數位dp)
bitset long push algorithm getchar() per char using name 大意: n把鏟子, 價格1,2,3,...n, 求有多少個二元組(x,y), 滿足x+y末尾數字9的個數最多. 枚舉最高位. #include &
Codeforces 55D Beautiful numbers(數位dp)
pac urn etc number div clu 能夠 是我 tdi 題目大意:T(<=10)組數據,求[a,b]能夠被其每個數位的數都整除的數(a,b<=9*10^18) 這題差一點就想出來了,可是最後一步好難想也好妙啊 首先這個數能夠整除各個
CodeForces 55D - Beautiful numbers - [數位DP+離散化]
一個數 nta 整數 it is while 超出 sts cif include 題目鏈接:https://cn.vjudge.net/problem/CodeForces-55D Volodya is an odd boy and his taste is strang
CodeForces - 55D Beautiful numbers(數位DP+離散化)
題目 題意: 一個數能被其數位上非0的數整除,稱為beautiful number;求區間beautiful number數的數目; 思路: 能被數位上的每個數整除的話,意思就是該數能被數位上所有非0數的最小公倍數整除。 考慮數位DP,dp[i][j][k
CodeForces - 55D(數位dp,離散化)
題目來源:http://codeforces.com/problemset/problem/55/D Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer numb
Codeforces 55D - Beautiful numbers 數位dp
+= 數位 con can -- memset beautiful define printf 55D - Beautiful numbers 把lcm離散化一下就能過了。 #include<bits/stdc++.h> #define LL long
【數位DP】 【CodeForces 55D】
題意:求區間[a, b]中有多少個數能整除自身的每個非0數位。 分析:一個數位只有1~9種可能,而1~9的lcm=2520。滿足要求的數所有數位的lcm一定是2520的因子, 所以可先求
codeforces 55d (lcm+數位dp)附板子
就是學習的人家的,很久不寫,數位dp也忘記了咋寫。 程式碼如下: 注意dp只需要初始化時更新一次就好, dp[i][j][k] 表示,右數第 i 位 ,mod為 j 時,lcm為k 的符合要求數目, 此處把lcm離散化了一下, #include <iostr
codeforces 388D Fox and Perfect Sets(線性基+數位dp)
mar sets back lld sizeof class define ++ () #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define
Codeforces 55d-----狀壓dp and math
一點 tail amp pro 定義 printf 一段 for 鏈接 先貼一下題目鏈接: https://vjudge.net/problem/CodeForces-55D 題意大致如下: 給t次詢問, 每次詢問給出一段區間【l,r】 要你
E. Segment Sum (數位dp)Educational Codeforces Round 53 (Rated for Div. 2)
題目連結:http://codeforces.com/contest/1073/problem/E 參考連結:https://blog.csdn.net/qq_38677814/article/details/83415782 題意:給出l,r,k,在範圍 [ l , r ] 內找出數字
CodeForces-431D Random Task(二分答案+數位DP)
題意 給定 m m m 和
Segment Sum CodeForces - 1073E (經典數位dp統計和問題)
題意:給出l,r求出區間裡,滿足不同數的個數小於等於k的數的和。 思路:先解決第一個問題:如何統計不同數的個數?思路很簡單,因為只有0到9這10個數字,每出現一個新數字,將其用二進位制狀態表示出來,那麼我們只要統計最後狀態即可知道有多少個不同的數字。 第二個問題:如何計算和? 首先一個錯誤的
【Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum】 數位DP
E. Segment Sum 題意 題 意 很
Codeforces 1073E——狀壓+數位dp
題意 輸入l r k,輸出區間[l,r]內數位種數不超過k的數字之和,比如l=10,r=50,k=1,答案就是11+22+33+44=110 1<=l<=1e18,1<=e<=1e18,1<=k<=9 思路 比較明顯的數位dp,因為要考慮當前所
codeforces 1073 E. Segment Sum(數位dp統計和)
題目連結:http://codeforces.com/problemset/problem/1073/E 思路:數位dp按位求貢獻算和 #include <cstdio> #include <cstdlib> #include <cstring> #i
CodeForces - 1073E :Segment Sum (數位DP)
You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from l l to r r (including l&nb
【codeforces 1036C】Classy Numbers(數位dp)
C. Classy Numbers time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard output Le