[BZOJ1974][SDOI2010]代码拍卖会[插板法]
题意
询问有多少个数位为 \(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]代码拍卖会[插板法]的更多相关文章
- SDOI2010代码拍卖会 (计数类DP)
P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...
- Luogu2481 SDOI2010 代码拍卖会 DP、组合
传送门 神仙DP 注意到\(N \leq 10^{18}\),不能够直接数位DP,于是考虑形成的\(N\)位数的性质. 因为低位一定不会比高位小,所以所有满足条件的\(N\)位数一定是不超过\(9\) ...
- 洛谷 P2481 [SDOI2010]代码拍卖会(背包+隔板法)
题面传送门 题意: 给出 \(n,p\),求有多少 \(n\) 位数 \(X=a_1a_2a_3\dots a_n\) 满足: 该 \(n\) 位数不含前导零 \(a_i \leq a_{i+1}\) ...
- [SDOI2010]代码拍卖会
题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...
- bzoj 1974: [Sdoi2010]代码拍卖会
Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代 码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPi g不想把代码库给所有想要的小猪,只想 ...
- 洛谷 P2481 [SDOI2010]代码拍卖会
洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...
- [SDOI2010]代码拍卖会——DP
原题戳这里 绝对是一道好题 需要注意到两个东西 1.符合条件的数可以拆成一堆\(11...11\)相加的形式,比如\(1145=1111+11+11+11+1\) 2.\(1,11,111,1111, ...
- luogu P2481 [SDOI2010]代码拍卖会
luogu 题目中的那个大数一定是若干个1+若干个2+若干个3...+若干个9组成的,显然可以转化成9个\(\underbrace {111...1}_{a_i个1}(0\le a_1\le a_2\ ...
- 【BZOJ-1974】auction代码拍卖会 DP + 排列组合
1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 305 Solved: 122[Submit ...
随机推荐
- 定制NSError
定制NSError 效果: 系统的NSError是可以自己定制的,以下提供代码来实现并表示如何使用: YXError.h 与 YXError.m // // YXError.h // CustomYX ...
- django中的字段类型
from http://www.cnblogs.com/lhj588/archive/2012/05/24/2516040.html Django 通过 models 实现数据库的创建.修改.删除等操 ...
- 工具类-vim在shell中卡死的情况
time:2015/11/35 在xshell下面使用vim编辑,有时候会出现突然卡死的情况.但是如果重新开一个终端的话,打开文件又是一大堆问题,今天又碰到了,搜了一下就找到一个帮助了[1] 原因:按 ...
- TreeSet集合的add()方法源码解析(01.Integer自然排序)
>TreeSet集合使用实例 >TreeSet集合的红黑树 存储与取出(图) >TreeSet的add()方法源码 TreeSet集合使用实例 package cn.itca ...
- 应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址 LocalHost (使用 LRPC) 中的用户
这是安装biztalk server 2013出现的问题,很多天了没解决,下边这个解决办法也搜到过类似的,但上次实验时出现设置组件权限时发现都是按钮都是灰的,无法操作. 这次设置好了.谢谢ibg. 文 ...
- zabbix 监控iptables
参看的文章链接忘了...... yum -y install iptstate 1.脚本位置和内容 [root@web1 scripts]# pwd /etc/zabbix/scripts [root ...
- 关于layui(layer)子页面获取不到父页面jQuery对象的问题。
如果在使用layui-layer模块过程中,在子页面执行代码: window.parent.$("#id").val() 报错:window.parent.$ is not a f ...
- lambda表达式和groovy闭包的区别
groovy定义的闭包是 Closure 的实例,lambda表达式只是在特定的接⼝或者抽象类的匿名实现,他们之间最主要区别闭包可以灵活的配置代理策略⽽labmda表达式不允许
- Oracle-本地连接没问题,远程连接有问题解决方式
1. 问题 我的环境是oracle11gr2,本地用plsql还是toad连接都没有不论什么问题,而用别的机器远程连接就提示 无监听程序等错误. 2. 原因 oracle安装路径 --- 比如: F ...
- Java基础加强之并发(四)synchronized关键字
并发系列参考文章http://www.cnblogs.com/skywang12345/p/3323085.html#3907193 synchronized原理 在java中,每一个对象有且仅有一个 ...