传送门

题目大意

定义n-magic为从左往右,偶数位置均为n,奇数位置不为n的一类数。求出[a,b]内所有可被m整除的d-magic个数。

分析

显然是数位dp,我们用dp[i][j][k]表示考虑到第i位,小于还是等于范围,对m取模的余数为k的时候的个数,然后我们枚举所有满足情况的j(i为奇数则j不能为d,i为偶数则j只能为d)进行转移,转移为经典的数位dp转移。最后记得因为答案取模过所以可能在相减后变为负数因此要进行一下特殊处理。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int mod = 1e9+;
int d,M,dp[][][],a[],cnt,m[];
char s[];
int go(){
int i,j,k;
scanf("%s",s);
cnt=strlen(s);
m[]=;
for(i=;i<cnt;i++){
a[i+]=(s[i]-'');
m[i+]=(m[i]*+a[i+])%M;
}
memset(dp,,sizeof(dp));
dp[][][]=;
for(i=;i<=cnt;i++){
for(j=;j<=a[i];j++){
if((i&)&&j==d)continue;
if(!(i&)&&j!=d)continue;
k=m[i-];
int x=(k*+j)%M;
if(j==a[i])dp[i][][x]=(dp[i][][x]+dp[i-][][k])%mod;
else dp[i][][x]=(dp[i][][x]+dp[i-][][k])%mod;
}
for(j=;j<=;j++)
for(k=;k<M;k++){
if((i&)&&j==d)continue;
if(!(i&)&&j!=d)continue;
int x=(k*+j)%M;
dp[i][][x]=(dp[i][][x]+dp[i-][][k])%mod;
}
}
return (dp[cnt][][]+dp[cnt][][])%mod;
}
int ck(){
int ok=,sum=;
for(int i=;i<=cnt;i+=){
sum=((sum<<)+(sum<<)+a[i])%M;
if(a[i]==d)return ;
}
for(int i=;i<=cnt;i+=){
sum=((sum<<)+(sum<<)+a[i])%M;
if(a[i]!=d){
ok=;
break;
}
}
if(sum)ok=;
return ok;
}
int main(){
scanf("%d%d",&M,&d);
cout<<abs(go()-ck()-go()-mod)%mod<<endl;
return ;
}

628D Magic Numbers的更多相关文章

  1. Codeforces 628D Magic Numbers

    题意: 求在[a,b](a,b不含前导0)中的d−magic数中有多少个是m的倍数. 分析: 计数dp Let's call a number d-magic if digit d appears i ...

  2. CodeForces 628D Magic Numbers (数位dp)

    题意:找到[a, b]符合下列要求的数的个数. 1.该数字能被m整除 2.该数字奇数位全不为d,偶数位全为d 分析: 1.dp[当前的位数][截止到当前位所形成的数对m取余的结果][当前数位上的数字是 ...

  3. Magic Numbers CodeForces - 628D

    Magic Numbers CodeForces - 628D dp函数中:pos表示当前处理到从前向后的第i位(从1开始编号),remain表示处理到当前位为止共产生了除以m的余数remain. 不 ...

  4. Codeforces CF#628 Education 8 D. Magic Numbers

    D. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. Educational Codeforces Round 8 D. Magic Numbers

    Magic Numbers 题意:给定长度不超过2000的a,b;问有多少个x(a<=x<=b)使得x的偶数位为d,奇数位不为d;且要是m的倍数,结果mod 1e9+7; 直接数位DP;前 ...

  6. URAL 1727. Znaika&#39;s Magic Numbers(数学 vector)

    主题链接:http://acm.timus.ru/problem.aspx?space=1&num=1727 1727. Znaika's Magic Numbers Time limit: ...

  7. 【CF628D】Magic Numbers 数位DP

    [CF628D]Magic Numbers 题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).$a,b<10^{2 ...

  8. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  9. CodeForces 628 D Magic Numbers 数位DP

    Magic Numbers 题意: 题意比较难读:首先对于一个串来说, 如果他是d-串, 那么他的第偶数个字符都是是d,第奇数个字符都不是d. 然后求[L, R]里面的多少个数是d-串,且是m的倍数. ...

随机推荐

  1. 寻找节点d=n的节点算法

    这里的算法是毕设过程中,自己想到的,也不知道有不有人提出过.这里就记录下发现的过程的具体的算法,以后会用到 背景描述 毕设做的是「社交网络中病毒传播的预测」,前期过程主要是模拟几个网络的数据,然后从一 ...

  2. 15_游戏编程模式EventQueue

    #### 两个例子 .GUI event loop ``` while (running) { // 从事件队列里获取一个事件 Event event = getNextEvent(); // Han ...

  3. cscope配置和使用

    , cscope安装 软件下载:http://sourceforge.net/project/showfiles.php?group_id=4664 软件安装: ./configure --with- ...

  4. UVA - 11214 Guarding the Chessboard (可重复覆盖,DLX+IDA*)

    题目链接 正解是IDA*+四个方向判重,但由于是个裸的可重复覆盖问题,可以用DLX水过~ 每个格子与放上皇后能干掉的标记连边,跑可重复覆盖DLX.注意要用IDA*来优化,否则会超时. #include ...

  5. php中empty(), is_null(), isset()函数区别(转)

    empty(), is_null(), isset()真值表(区别)   我们先来看看这3个函数的功能描述 www.111cn.net isset 判断变量是否已存在,如果变量存在则返回 TRUE,否 ...

  6. BZOJ2276:[POI2011]Temperature

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  7. 蓝桥杯 基础练习 BASIC-25 回形取数

    基础练习 回形取数   时间限制:1.0s   内存限制:512.0MB 问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 ...

  8. springboot实现定时任务的一种方式

    参考:https://www.yoodb.com/news/detail/1205 目前觉得这种还是很好用,所以就记录. 最好新建一个项目测试: 1. pom中添加 <dependency> ...

  9. webrtc doubango linphone

    1.doubango官网:http://www.doubango.org/ 2.doubango是一个开源的VOIP基础平台, 并能用于嵌入式和桌面系统的开源框架,该框架使用ANSCI-C编写,具有很 ...

  10. java代码输出1到100的质数

    总结:循环,循环.. package com.dfd; import java.util.Scanner; //输出0到100的质数 //要判断当到100时候,等于2的直接输出,能被2整除的不输出, ...