一般这种计数题就两个套路:找到倍数然后删除不合法的   找到合法的然后删除不是倍数的

如果先找倍数,那不合法的数位置和倍数没有直接关系

这个题是要先找合法的 然后删除不是倍数的

首先这个合法的数找的方法最传统的是数位dp,但显然不行,如果考虑对数位dp进行优化的话,也无非是矩乘之类的过程优化

所以必须考虑转移优化,剪枝就是只循环比上一位大的,然后套用前缀和

但这样的剪枝也是没用的,由于n的特殊性,在枚举数位的时候就要离散了

由于数位dp是万能算法,不是专一算法,所以应考虑根据题目进行变动

题目是要求升序,是一个对行的要求,虽然列是1e18,但行里的数字只有可能是单调的1~9,考虑按行做

然后就考虑这个数列在哪个位置改数 最多改9处,然后就相当于给一个从起点到指定位置+1;

所以就相当于+1 +11 +111 +1111……

然后就考虑用这些数字怎么构成k的倍数就可以了,用类似循环节的处理方法就可以了

主要就是要知道优化的最重要的就是去除重复,所以需要找到问题求解中重复的部分,换角度找重复的部分,想办法构造重复的部分,重复的部分还有很多(如加换乘,枚举换背包、循环化除、枚举化二分、扫描无用化单调队列……)离散后直接用数学或基本模型

码:

#include<iostream>
#include<cstdio>
using namespace std;
long long P=999911659;
#define ll long long
ll i,j,n,K,l,k,ni[11],C[505][15],f[15][505],g[15][505],x,y,s,cnt[505],len,wz[505],qd,ans,v[505];
void exgcd(ll a,ll b)
{if(!b){x=1;y=0;return; }exgcd(b,a%b);ll t=x;x=y;y=t-(a/b)*y;
}
int main()
{
scanf("%lld%lld",&n,&K);ni[1]=1;for(i=2;i<=9;i++)exgcd(i,P),ni[i]=(x+P)%P;
if(K==1)
{ans=1;for(i=1;i<=8;i++){ans=ans*((n+i)%P)%P*ni[i]%P;}printf("%lld",ans);return 0;
}
if(n<K)
{for(i=1;i<=n;i++)
{s=(s*10+1)%K;cnt[s]++;
}
}else
{
for(i=1;i<=K+1;i++)
{s=(s*10+1)%K;if(cnt[s]){len=i-wz[s];//周期    qd=wz[s];break;}wz[s]=i;v[i]=s;cnt[s]++;
}
for(i=qd;i<=qd+len-1;i++)cnt[v[i]]=0;
for(i=qd;i<=qd+len-1;i++)//普及周期 {cnt[v[i]]+=((n-qd+1)/len);if((n-qd+1)%len!=0&&(n-qd+1)%len>=i-qd+1)cnt[v[i]]++;cnt[v[i]]%=P;}
if((n-qd+1)%len==0)s=v[qd+len-1];
else s=v[qd+(n-qd+1)%len-1];
}for(i=0;i<K;i++){C[i][0]=1;for(j=1;j<=9;j++)C[i][j]=C[i][j-1]*(cnt[i]+j-1)%P*ni[j]%P;}
f[1][s]=1;for(j=0;j<K;j++)//要加哪一个 {for(i=0;i<K;i++)//当前余数  for(k=1;k<=9;k++) //当前几个 for(l=0;l<=9-k;l++)//要加几个 {g[k+l][(i+j*l%K)%K]+=f[k][i]*C[j][l]%P;g[k+l][(i+j*l%K)%K]%=P;}for(k=0;k<K;k++)for(i=0;i<=9;i++){f[i][k]=g[i][k];g[i][k]=0;}}
for(i=1;i<=9;i++)
ans+=f[i][0],ans%=P;
printf("%lld",ans);
} 

bzoj1974 [Sdoi2010]代码拍卖会 循环+背包相关推荐

  1. [BZOJ1974][SDOI2010]代码拍卖会[插板法]

    题意 询问有多少个数位为 \(n\) 的形如 \(11223333444589\) 的数位值不下降的数字在\(\mod p\) 的意义下同余 \(0\). $n\leq 10^{18} ,p\leq ...

  2. SDOI2010 代码拍卖会

    SDOI2010 代码拍卖会 题意: 题目传送门 题解: 看完题目之后,第一反应应该就是数位\(Dp\)了,但是考虑到\(N\)非常的大,我们需要考虑另一种方法.注意到这个满足条件的数字的每一位都大于 ...

  3. bzoj 1974: [Sdoi2010]代码拍卖会

    Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代 码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPi g不想把代码库给所有想要的小猪,只想 ...

  4. php ip2long bug,PHP代码ip2long 循环有关问题

    PHP代码ip2long 循环问题 print_r($dataIp); foreach ($dataIp as $key=>$value) { $data['ip']     =   $valu ...

  5. python循环一段代码_Python循环语句代码详解:while、for、break

    导读:循环语句是指重复执行同一段代码块,通常用于遍历集合或者累加计算.Python中的循环语句有while语句.for语句. 01 while循环 循环语句是程序设计中常用的语句之一.任何编程语言都有 ...

  6. Excel VBA 笔记 第一次写代码-For循环 (Excel基础)

    第一次写代码-For循环 (Excel基础)     1.Excel 宏的使用     2.手工写VBA代码     3.使用for 1.Excel 宏的使用     准备工作:调出开发工具:文件-& ...

  7. [BZOJ1974][Sdoi2010]auction 代码拍卖会(dp+组合数学)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=1974 Solution 看上去是一个显然的数位 dp ,但是看到 N≤1018N≤ ...

  8. BZOJ 1974 [Sdoi2010]auction 代码拍卖会 | 51nod 1261 上升数

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1974 http://www.51nod.com/onlineJudge/questionCo ...

  9. 处理业务代码中循环遍历出现的性能问题

    在开发中很多场景下我们都会用到foreach循环遍历一个list,并在内部通过sql再去查询对应的数据,代码如下 public void test(){// 获取知识点关联数据List<Know ...

最新文章

  1. OpenCV中检测ChArUco的角点(2)
  2. mysql 乐观锁 命令_MySQL-乐观锁
  3. 如何使用graphpad做柱形图_自建房如何做防雷接地?使用什么材料?卫生间等电位如何连接?...
  4. 动态调用WebService
  5. 共享一个查找IP所在交换机端口的方法
  6. MIT科学家正在教AI感受电影中的喜怒哀乐
  7. MySQL利用磁盘缓存写入_MySQL写入缓冲区在数据库中的作用( Change Buffer )
  8. python 判断div 之间的内容是否为空_python实现数据结构与算法之双端队列实现
  9. 穷人变富的过程中,最大的阻碍是什么?
  10. 选书不迷茫,国内原创佳作推荐,附赠神级优惠码༼⍤༽
  11. easyui 提示框组件_jQuery EasyUI 教程-Tooltip(提示框)
  12. Reactor模型讲解
  13. 锐起无盘工作站的安装
  14. 信号的频谱分析,加噪降噪处理
  15. 使用JS打开word在线编辑,直接编辑在线doc文件
  16. Android,java敏感词,QQ,微信自动过滤组件
  17. lbj学习日记 05 一维数组和二维数组
  18. IDEA开发工具整合YAPI接口平台
  19. STM32 内部Flash读写 程序源码 [已验证]
  20. wfp 禁用ip_WFP网络过滤驱动——限制网站访问

热门文章

  1. etc php5 conf.d,php – nginx:[emerg]“location”指令不允许在/etc/nginx/conf.d/default.conf中使用:...
  2. 百度测试开发提前批一面面经
  3. python人工智能github的一些跑程序技巧(持续更新~)
  4. sql group by 取每组符合条件_SPL 简化 SQL 案例详解:计算各组前 N 行
  5. api token 什么意思_还分不清 Cookie、Session、Token、JWT?
  6. ajax获取301,PHP获取301重定向页面跳转后真实URL地址
  7. c语言中输出9个空格,新人提问:如何将输出时每行最后一个空格删除
  8. python怎么设置回文数_python如何写一个函数判断回文数?
  9. python程序设计与应用第4章实验
  10. linux查找某时间后的关键字,linux - 查找指定时间的文件及文件中的关键字