题意

询问有多少个数位为 \(n\) 的形如 \(11223333444589\) 的数位值不下降的数字在\(\mod p\) 的意义下同余 \(0\)。

$n\leq 10^{18}\ ,p\leq 500 $ 。

分析

  • 考虑普通的状态,矩乘和考虑每种数字选择什么都没法做,要另辟蹊径。

  • 发现这样的数字都可以拆分成1~9个形如 \(111111\) 的形式,记为 \(\rm gg\)。

  • 考虑算出所有此类数字在\(\mod p\) 意义下余数为 \(x\) 的有多少个。

  • 状态呼之欲出: \(f_{i,j,k}\) 表示考虑到 \(\rm gg\) 余数为 \(i\) 的 ,总的余数为 \(j\) ,已经选择了 \(k\) 个 \(\rm gg\) 的方案总数。

  • 转移枚举 \(\rm gg\) 余数为 \(i\) 的选择了多少个,注意这类 \(\rm gg\) 的选择是组合而不是排列,考虑插板法算方案。

  • 总时间复杂度为\(O(10^2*p^2)\)。

可重集的排列变组合可以考虑插板法。

代码

#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=504,mod=999911659;
LL st,n,p,rev[N],cnt[N],f[N][N][10],inv[N];
int pos[N];
void add(LL &a,LL b){a+=b;if(a>=mod) a-=mod;}
LL C(LL n,LL m){
LL res=1ll;
for(LL i=n-m+1;i<=n;++i) res=i%mod*res%mod;
for(LL i=2;i<=m;++i) res=res*inv[i]%mod;
return res;
}
int main(){
scanf("%lld%lld",&n,&p);
inv[1]=1;
for(int i=2;i<=500;++i) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
memset(pos,-1,sizeof pos);
pos[0]=0,rev[0]=0,cnt[0]=1;LL v=1%p;
for(LL i=1;i<=min(n,p);++i){
if(pos[v]!=-1){
LL len=i-pos[v],a=(n-i+1)/len,b=(n-i+1)%len;
st=rev[pos[v]+(b-1+len)%len];
for(int j=pos[v];j<i;++j) cnt[rev[j]]+=a+(j-pos[v]+1<=b);
break;
}else if(i==n) st=v;
pos[v]=i,rev[i]=v,cnt[v]++;
v=(v*10+1)%p;
}
rep(k,0,8) f[0][st][k]=C(cnt[0]+k-1,k); rep(i,1,p-1)
rep(j,0,p-1)
rep(k,0,8){
f[i][j][k]=f[i-1][j][k];
rep(h,1,k)
add(f[i][j][k],f[i-1][((j-h*i)%p+p)%p][k-h]*C(cnt[i]+h-1,h)%mod);
}
printf("%lld\n",f[p-1][0][8]);
return 0;
}

[BZOJ1974][SDOI2010]代码拍卖会[插板法]的更多相关文章

  1. SDOI2010代码拍卖会 (计数类DP)

    P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...

  2. Luogu2481 SDOI2010 代码拍卖会 DP、组合

    传送门 神仙DP 注意到\(N \leq 10^{18}\),不能够直接数位DP,于是考虑形成的\(N\)位数的性质. 因为低位一定不会比高位小,所以所有满足条件的\(N\)位数一定是不超过\(9\) ...

  3. 洛谷 P2481 [SDOI2010]代码拍卖会(背包+隔板法)

    题面传送门 题意: 给出 \(n,p\),求有多少 \(n\) 位数 \(X=a_1a_2a_3\dots a_n\) 满足: 该 \(n\) 位数不含前导零 \(a_i \leq a_{i+1}\) ...

  4. [SDOI2010]代码拍卖会

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

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

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

  6. 洛谷 P2481 [SDOI2010]代码拍卖会

    洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...

  7. [SDOI2010]代码拍卖会——DP

    原题戳这里 绝对是一道好题 需要注意到两个东西 1.符合条件的数可以拆成一堆\(11...11\)相加的形式,比如\(1145=1111+11+11+11+1\) 2.\(1,11,111,1111, ...

  8. luogu P2481 [SDOI2010]代码拍卖会

    luogu 题目中的那个大数一定是若干个1+若干个2+若干个3...+若干个9组成的,显然可以转化成9个\(\underbrace {111...1}_{a_i个1}(0\le a_1\le a_2\ ...

  9. 【BZOJ-1974】auction代码拍卖会 DP + 排列组合

    1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 305  Solved: 122[Submit ...

随机推荐

  1. Python学习---JSON补充内容[中文编码 + dumps解析]

    JSON补充内容[微信解决中文乱码,接上] import json # 英文显示 dic = {"hello": "world"} str = json.dum ...

  2. magento2 重置后台密码

    项目根目录:运行如下命令 bin/magento admin:user:create --admin-user="admin" --admin-password="123 ...

  3. c++ 数组操作(转)

    转自 http://www.cnblogs.com/kykuaileren/archive/2011/09/04/2166646.html 一.数组定义和初始化 1: 一维数组初始化: 2: 标准方式 ...

  4. 我的第一个springboot应用+maven依赖管理

    第一步:使用Eclipse创建maven工程SpringBootFirst:工程目录如下 第二步:编写依赖文件pom.xml <project xmlns="http://maven. ...

  5. Java基础知识强化之集合框架笔记79:HashMap的实现原理

    1. HashMap的实现原理之 HashMap数据结构: HashMap是对数据结构中哈希表(Hash Table)的实现, Hash表又叫散列表.Hash表是根据关键码Key来访问其对应的值Val ...

  6. 4-3 R语言函数 mapply

    #mapply(函数/函数名,数据,函数相关的函数) > list(rep(1,4),rep(2,3),rep(3,2),rep(4,1)) [[1]] [1] 1 1 1 1 [[2]] [1 ...

  7. ngRouter和ui-router区别

    在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.本文主要对 AngularJS 原生的 ngRoute 路由模块和第三方路由模块 ui.router 的用法进行简单介绍,并做一个对比 ...

  8. linq to sql 分页技术

    昨天在用LINQ写分页的时候碰到一个很奇怪的问题:翻页的时候,有的数据会莫名其妙地消失,查了半个多小时才发现问题所在,其实是一个很细节的地方. 数据表如下: LINQ分页的实现是: var artic ...

  9. NYOJ17 最长单调递增子序列 线性dp

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 分析: i=1 dp[i]=1 i!=1 dp[i]=max(dp[j]+1) ...

  10. unlink与close关系

    close和unlink.以前时候总是不太理解两者的区别,最近看到一篇博客比较详细地描述了二者的本质区别,这里我引用了它的原文.         “每一个文件,都可以通过一个struct stat的结 ...