首页 > 其他分享 >SP8177 题解

SP8177 题解

时间:2023-09-08 10:56:09浏览次数:55  
标签:20 2520 公倍数 题解 ll SP8177 len int

2023-09-01 11:29:13 solution

题意:

每次询问 \([l,r]\) 内有多少个数满足可以被所有非 \(0\) 数位整除。

思路

看到这个数据范围和题目描述,显然是数位 dp。

因为 \(1\sim 9\) 的最小公倍数是 \(2520\),并且 \(2520\) 是其他所有 \(1\sim 9\) 子集的最小公倍数的倍数,所以我们只需要边对 \(2520\) 取模然后边算这个数的最小公倍数,然后最后看对 \(2520\) 取模的结果对最小公倍数取模是否为 \(0\) 即可(为 \(0\) 代表可以被这些公倍数整除)。

可是如果直接存一维余数,一维公倍数,一维长度,数组是 \(2520^2\times 20\),显然炸了,我们发现公倍数最多只有 \(48\) 个,那就好做多了。

注意不要开对上界 \(lim\) 的记忆化,每次询问之间也不要清空,不然就相当于要跑 \(T\) 次 \(2520\times 48 \times 20\) 显然时间复杂度炸了,所以我们留着之前没有被限制的答案,对于现在的答案的贡献也是正确的,每次只需要多算被限制的即可。

\(Code\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T,mod=2520;
ll f[20][48][2520],A[20],to[2521];
ll dfs(int len,int mv,int lcm,bool lim){
    if(!len)return !(mv%lcm);
    if(!lim&&~f[len][to[lcm]][mv])return f[len][to[lcm]][mv];
    int up=lim?A[len]:9;
    ll res=0;
    for(int i=0;i<=up;i++)
        res+=dfs(len-1,(mv*10+i)%mod,((i==0||!(lcm%i))?lcm:(lcm*i/__gcd(lcm,i))),lim&(i==up));
    return lim?res:(f[len][to[lcm]][mv]=res);
}
ll solve(ll n){
    int len=0;
    while(n){
        A[++len]=n%10;
        n/=10;
    }
    return dfs(len,0,1,1);
}   
int main(){
    memset(f,-1,sizeof(f));
    for(int i=1,cnt=0;i<=mod;i++)if(!(mod%i))to[i]=cnt++;
    ios::sync_with_stdio(0);cin.tie(0);
    for(cin>>T;T--;){
        ll l,r;
        cin>>l>>r;
        cout<<solve(r)-solve(l-1)<<endl;
    }
}

标签:20,2520,公倍数,题解,ll,SP8177,len,int
From: https://www.cnblogs.com/NBest/p/17686999.html

相关文章

  • CF402D 题解
    2023-09-0418:42:46solution不难想到我们要先记录一下每一位的前缀\(\gcd\),我们发现我们选择一位的前缀\(\gcd\)除掉以后,前缀\(\gcd\)会变为\(1\)并且会导致这位之后的\(\gcd\)全部为\(1\)。所以每一位只能选择一次,并且我们从后往前扫肯定比从前往后扫要更优。我们......
  • wzOI 2023.8.31 题解
    2023-09-0115:59:41$$前言$$太菜了,第一题都打成那样了没发现是MST,第三题数据范围没有很仔细看,以为是乱搞(组合之类的)题就直接跳了。不得不说这次比赛题目的一些思路还是挺妙的,一些想法确实我这种成分想不太到。$$A$$$$题意$$给出了\(m\)个可以查询的区间\([L_i,R_i]\)......
  • CF1103C 题解
    2023-09-0514:52:07solution找路径很好找,我们随便跑个dfs树找个深度\(\ge\frac{n}{k}\)的路径输出即可。可是怎么找\(k\)个长度不是\(3\)的倍数的环呢?既然我们跑了dfs树,那么就没有横叉边,对于叶子节点非树边只有返祖边,然后一看这个很奇怪的条件——保证每个点度数大......
  • CF1851 部分题解
    2023-07-3019:35:02前言因为我实在是太菜了,没时间也不会做最后两题,所以这里只有前\(5\)道签到题的题解。之后我有时间看了后两题的题解再来更新吧~A先不用看那么多七七八八的,搞清楚下面几点即可:高度不能相同。高度差得被整除。高度差不能太大。好了,然后就可以\(AC\)......
  • 暑假集训Day19 比赛题解
    2023-08-0516:22:13总结这次打下来,由于T2贪心不够完全,T3模拟\(5\)个时不是最优,T4想到暴力做法但是来不及打,加之全都是捆绑测试点,导致我T2,T3虽然加起来有不少点对了,但是还是判全错,最后也只剩下T1的100。感觉这次前三题也不难,都是可做的,T4的30pts暴力也很白给,但......
  • 暑假集训 Day17 模拟赛题解
    2023-08-0318:18:03前言好家伙,很少完整订正一场比赛,可能是因为这个比赛相对来说确实不难吧(至少正解不难)。总结与反思这场比赛其实没有我想象的那么难,只是觉得题目可能不简单,就没有往简单的思路想,反而是被之前讲过的题疑惑,以为要用到一些很奇特的算法,结果打完以后看了题解再结......
  • UVA10368 题解
    2023-08-0615:18:08solution双倍经验这种有限轮游戏的博弈通常都是有两种状态,必胜态和必败态。对于必胜态,指的是从它可以转移到必败态。对于必败态,指的是从它不论如何只能转移到必胜态。对于每个玩家都采取最优策略的有限游戏,我们通常只需要关注必胜态与必败态之间的转移即......
  • 【题解】AtCoder Regular Contest 162
    A.EkidenRace题目描述:有\(n\)个人参加了往返赛跑,每个人有一个编号\(1\)到\(n\)。已知以下信息:如果按照往路的成绩排序,那么任何两个人的成绩都不相同。同时第\(i\)个人在往路中排名第\(i\)。如果按照往返的成绩排序,那么任何两个人的成绩都不相同。同时第\(i\)个人......
  • P9189 [USACO23OPEN] Custodial Cleanup G 题解
    Description奶牛旅馆可以被看作一个\(N\)个节点\(M\)条边的无向简单图,其中每个房间有一个颜色\(C_i\),以及一个钥匙,颜色为\(S_i\),FJ最初在\(1\)号节点,手上一把钥匙都没有。FJ可以进行无数次以下操作:捡起当前房间的钥匙。(FJ可以同时手持多个钥匙)将部分或全部手......
  • All Pairs Maximum Flow题解
    前置知识:1.P3376【模板】网络最大流2.P4897【模板】最小割树(Gomory-HuTree)Ebola有一句很著名的话如果你乱搞过了我请你抽烟那么这道题肯定不能普通的dinic直接水过去,不然就不是紫题了,那么直接祭出最小割树,复杂度\(O(Tn^3m)\),但是因为dinic跑不满,所以是可以过的。......