Description

随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代

码库。猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库。iPi

g不想把代码库给所有想要的小猪,只想给其中的一部分既关系好又

肯出钱的小猪,于是他决定举行了一个超大型拍卖会。 在拍卖会上

,所有的N头小猪将会按照和iPig的好感度从低到高,从左到右地在i

Pig面前站成一排。每个小猪身上都有9猪币(与人民币汇率不明),

从最左边开始,每个小猪依次举起一块牌子,上面写上想付出的买代

码库的猪币数量(1到9之间的一个整数)。大家都知道,如果自己付

的钱比左边的猪少,肯定得不到梦寐以求的代码库,因此从第二只起

,每只猪出的钱都大于等于左边猪出的价钱。最终出的钱最多的小猪

(们)会得到iPig的代码库真传,向着保送PKU(Pig Kingdom Unive

rsity)的梦想前进。 iPig对自己想到的这个点子感到十分满意,在

去现场的路上,iPig就在想象拍卖会上会出现的场景,例如一共会出

现多少种出价情况之类的问题,但这些问题都太简单了,iPig早已不

敢兴趣了,他想要去研究更加困难的问题。iPig发现如果他从台上往

下看,所有小猪举的牌子从左到右将会正好构成一个N位的整数,他

现在想要挑战的问题是所有可能构成的整数中能正好被P整除的有多

少个。由于答案过大,他只想要知道答案mod 999911659就行了。

Input

一行:两个数N(1≤N≤10^18)、P(1≤P≤500),用一个空格分开。

Output

一行:一个数,表示答案除以999911659的余数。

Sample Input

2 3

Sample Output

15

样例解释

方案可以是:12 15 18 24 27 33 36 39 45 48 57 66 69 78 99,共15种。

解题报告:

这题真的可以玩死人啊,见过的最恶心,没有之一,首先要明白,这题中因为存在数列递增的性质,所以可以拆成1,11,111,1111,11111...中任意选9个以下的数字的和构成的数字,这也是此题给我的最大启发.

然后就是DP,首先看数据范围我们只能从p下手,我们先预处理出1,11,111...中cnt[i]表示mod P后==i的数的个数,这个可以发现是循环的,处理完这里你就胜利了,DP十分简单,定义f[i][j][k] 表示已经处理到了前cnt[i],和mod P为j,一共用了k个数字的方案,容易看出f[i+1][(j+l×i)][k+l]=f[i][j][k]×C[cnt[i]+l-1][l],C[cnt[i]+l-1][l] 是从cnt[i]个中选出l个的可重组合方案

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n;
int k,f[505][10][505],dep[505],inv[10],c[505][10];
long long cnt[505];
long long p=999911659;
int main()
{ scanf("%lld%d",&n,&k);
int s=0;
cnt[0]++;
int beg,len;
if(n<=k)for(int i=1;i<=n;i++)cnt[s=(s*10+1)%k]++,cnt[s]%=p;
else
{ for(int i=1;i<=k+1;i++)
{ s=(s*10+1)%k;
if(cnt[s])
{ beg=dep[s];
len=i-dep[s];
break;
}
cnt[s]++;
dep[s]=i;
}
for(int i=0;i<k;i++)if(cnt[i]>0&&dep[i]>=beg)
{ cnt[i]=(n-beg+1)/(long long)len%p;
if((dep[i]-beg+1)<=(n-beg+1)%(long long)len)cnt[i]=(cnt[i]+1)%p;
if((dep[i]-beg+1)%(long long)len==(n-beg+1)%(long long)len)s=i;
}
}
inv[1]=1;
for(int i=2;i<=8;i++)inv[i]=p-(long long)(p/i)*inv[p%i]%p;
memset(f,0,sizeof 0);
memset(c,0,sizeof c);
for(int i=0;i<k;i++)
{ c[i][0]=1;
for(int j=1;j<=8;j++)
{ c[i][j]=cnt[i]*c[i][j-1]%p*inv[j]%p;
cnt[i]++;
cnt[i]%=p;
}
}
f[0][0][s]=1;
for(int i=0;i<k;i++)
{ for(int j=0;j<9;j++)
{ for(int x=0;x<k;x++)
{ for(int y=0;y<=j;y++)
{ f[i+1][j][x]=(f[i+1][j][x]+(long long)f[i][j-y][(x-y*i%k+k)%k]*c[i][y]%p)%p;
}
}
}
}
printf("%d\n",f[k][8][0]);
return 0;
}

bzoj 1974: [Sdoi2010]代码拍卖会的更多相关文章

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

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

  2. BZOJ 1974: [Sdoi2010]auction 代码拍卖会( dp )

    在1, 11, 111……中选<=8个, + 11..(n个1)拼出所有可能...这些数mod p至多有p中可能, 找出循环的处理一下. 那么dp就很显然了...dp(i, j, k)表示前i种 ...

  3. BZOJ 1974 [Sdoi2010] auction 代码拍卖会(数位dp)

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

  4. BZOJ 1974 [Sdoi2010]auction 代码拍卖会 ——动态规划

    把每一位上不递减的数拆成1+11+11111+11111+..... 然后就可以把巨大的N从复杂度中消掉,因为随着长度的增加1...111%p出现了循环节. 然后就是从n个数中选出几个使他们结果为0( ...

  5. [SDOI2010]代码拍卖会

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

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

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

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

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

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

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

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

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

随机推荐

  1. MySQL InnoDB锁机制

    概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...

  2. 用nodejs 开发的智能提示

    用nodejs 开发的智能提示 时间:2014-07-01 03:50:18 类别:搜索引擎 访问: 2576 次 感谢:http://lutaf.com/223.htm 智能提示对于搜索非常重要,相 ...

  3. 剑指offer-删除链表中重复的节点

    题目描述   在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...

  4. PAT1048. Find Coins(01背包问题动态规划解法)

    问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  5. 第四章 使用jQuery操作DOM

    第四章 使用jQuery操作DOM 一.DOM操作 在jQuery中的DOM操作主要可分为样式操作.文本和value属性值操作.节点操作: 节点操作又包含属性操作.节点遍历和CSS-DOM操作. 其中 ...

  6. Linq 延迟加载

    IList<Student> ssList = new List<Student>() { , StudentName = "John", } , , St ...

  7. 移动端300ms与点透总结

    300ms,主要发生在mobile 为啥会出现300ms延迟现象 浏览器想知道用户是否dobule tap(双击缩放) 下列情况不会出现300ms延迟 桌面浏览器 meta的viewport设置了us ...

  8. Python学习之参数

    参数 # coding=utf-8 # 函数的参数 def power(x): return x * x; print power(5) 修改后 def power_1(x,n=2): #默认参数可以 ...

  9. logback中配置的日志文件的生成地址

    配置文件如下 <?xml version="1.0" encoding="UTF-8"?> <configuration debug=&quo ...

  10. ZOJ-1649 Rescue---BFS+优先队列

    题目链接: https://vjudge.net/problem/ZOJ-1649 题目大意: 天使的朋友要去救天使,a是天使,r 是朋友,x是卫兵.每走一步需要时间1,打倒卫兵需要另外的时间1,问救 ...