1. 程式人生 > >CodeForces 55D 數位DP

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 ] 內找出數字

Segment Sum CodeForces - 1073E (經典數位dp統計和問題)

題意:給出l,r求出區間裡,滿足不同數的個數小於等於k的數的和。 思路:先解決第一個問題:如何統計不同數的個數?思路很簡單,因為只有0到9這10個數字,每出現一個新數字,將其用二進位制狀態表示出來,那麼我們只要統計最後狀態即可知道有多少個不同的數字。 第二個問題:如何計算和? 首先一個錯誤的

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