题目描述

随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库。猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库。iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关系好又肯出钱的小猪,于是他决定举行了一个超大型拍卖会。

在拍卖会上,所有的N头小猪将会按照和iPig的好感度从低到高,从左到右地在iPig面前站成一排。每个小猪身上都有9猪币(与人民币汇率不 明),从最左边开始,每个小猪依次举起一块牌子,上面写上想付出的买代码库的猪币数量(1到9之间的一个整数)。大家都知道,如果自己付的钱比左边的猪 少,肯定得不到梦寐以求的代码库,因此从第二只起,每只猪出的钱都大于等于左边猪出的价钱。最终出的钱最多的小猪(们)会得到iPig的代码库真传,向着 保送PKU(Pig Kingdom University)的梦想前进。

iPig对自己想到的这个点子感到十分满意,在去现场的路上,iPig就在想象拍卖会上会出现的场景,例如一共会出现多少种出价情况之类的问题,但 这些问题都太简单了,iPig早已不敢兴趣了,他想要去研究更加困难的问题。iPig发现如果他从台上往下看,所有小猪举的牌子从左到右将会正好构成一个 N位的整数,他现在想要挑战的问题是所有可能构成的整数中能正好被P整除的有多少个。由于答案过大,他只想要知道答案mod 999911659就行了。

输入输出格式

输入格式:

输入文件auction.in有且仅有一行:两个数N(1≤N≤10^18)、P(1≤P≤500),用一个空格分开。

输出格式:

输入文件auction.out有且仅有一行:一个数,表示答案除以999911659的余数。

输入输出样例

输入样例#1:

2 3

输出样例#1:

15

说明

样例解释

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

数据规模

给定N,P,有一个数A是N位数,并且A的每一位不减(如11234)并且不超过9,求能被P整除的数有多少个。

分 析:首先我们注意到N非常大,O(N)绝对不能接受,但是P只有500,而且A这个数有非常奇妙的性质:由于A的每一位不减,所以可以将A拆成 0,1,11,111,1111,11111……中取九个的和(如11234=11111+111+11+1+0+0+0+0+0),这样一来,由于 11…111 mod P会出现循环,就可以将N从复杂度中消去,记Cnt[i]表示0,1,11……中mod P 为i的个数(0 <= I < P),题目就变成了从Cnt[i]中取九个使下标之和被P整除;
于是可以容易的想到动态规划,F[i][j][k]表示做到Cnt[i],当前取了k个,k个的和mod P为j,转移方程就是
F[i + 1][(j + l * i) % P][k + l] = (F[i][j][k] * Calc(l, Cnt[i]) + F[i + 1][(j + l * i) % P][k + l]) % mod;(枚举l)
其中Calc(l, Cnt[i])表示Cnt[i]中无差别的取出l个(可以重复)的方案数,根据排列组合的定理可知Calc(A, B) = C(A+B-1,A) 
复杂度:O(P*P*9*9)
记得最后的数还要加上111...11(n个1).因为在DP的时候这个数是可以有前导0的。
转载自http://trinklee.blog.163.com/blog/static/238158060201551422646803/
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long lol;
 7 lol Mod=999911659,ans;
 8 lol n,p,cnt[501],beg,len,pos[501],A[10],c[501][11],f[501][501][11],a;
 9 int main()
10 {lol i,j,k,l;
11   cin>>n>>p;
12   lol sum=0;
13   if (n<=p)
14     {
15       for (i=1;i<=n;i++)
16     {
17       sum=sum*10+1;
18       sum%=p;
19       cnt[sum]++;
20     }
21       a=sum;
22     }
23      else
24      {
25        for (i=1;i<=p+1;i++)
26      {
27        sum=sum*10+1;
28        sum%=p;
29        if (cnt[sum])
30          {
31            beg=pos[sum];
32            len=i-pos[sum];
33            break;
34          }
35        cnt[sum]++;
36        pos[sum]=i;
37      }
38        for (i=0;i<p;i++)
39      if (cnt[i]&&pos[i]>=beg)
40        {
41          cnt[i]=(n-beg+1)/len;
42          if (pos[i]-beg+1<=(n-beg+1)%len) cnt[i]++;
43          if ((pos[i]-beg+1)%len==(n-beg+1)%len) a=i;
44        }
45      }
46   A[1]=1;
47   for (i=2;i<=8;i++)
48     A[i]=(Mod-Mod/i)*A[Mod%i]%Mod;
49    for (i=0;i<p;i++)
50     {
51       c[i][0]=1;
52       if (cnt[i])
53       for (j=1;j<=8;j++)
54     {
55       c[i][j]=(cnt[i]*c[i][j-1]%Mod)*A[j]%Mod;
56         cnt[i]++;cnt[i]%=Mod;
57     }
58     }
59    f[0][a][0]=1;
60   for (i=0;i<p;i++)
61     {
62       for (j=0;j<p;j++)
63     {
64       for (k=0;k<9;k++)
65         {
66           for (l=0;l<=k;l++)
67         {
68           f[i+1][j][k]+=f[i][(j-(l*i%p)+p)%p][k-l]*c[i][l]%Mod;
69           f[i+1][j][k]%=Mod;
70           //cout<<i+1<<' '<<j<<' '<<k<<' '<<l<<' '<<f[i+1][j][k]<<endl;
71         }
72         }
73     }
74     }
75   for (i=0;i<=8;i++)
76     ans+=f[p][0][i],ans%=Mod;
77   cout<<ans;
78 }

转载于:https://www.cnblogs.com/Y-E-T-I/p/7701143.html

[SDOI2010]代码拍卖会相关推荐

  1. SDOI2010 代码拍卖会

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

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

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

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

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

  4. bzoj1974 [Sdoi2010]代码拍卖会 循环+背包

    一般这种计数题就两个套路:找到倍数然后删除不合法的   找到合法的然后删除不是倍数的 如果先找倍数,那不合法的数位置和倍数没有直接关系 这个题是要先找合法的 然后删除不是倍数的 首先这个合法的数找的方 ...

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

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

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

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

  7. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  8. 杂题记录及简要题解(一)

    一些前几天做过的还不错的但是不是太想专门花一整篇博客的篇幅去写的题就简要地记录在这里. 说是简要题解,其实写得还是挺详细的.之后的杂题记录可能就会写得简略一点. CF1060E Sergey and ...

  9. 隐私合规:收集SDK部分介绍

    com.meizu.cloud.pushsdk.SystemReceiver 魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族 push SDK 的客户端实时地推送通知或者消 ...

  10. BZOJ 1923: [Sdoi2010]外星千足虫

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 921  Solved: 592 [Submit][Stat ...

最新文章

  1. 原来流行也可以变成怀旧!
  2. jQuery小测试系列之jQuery基础知识
  3. [OS复习]进程管理3
  4. JAVA 框架-Spring
  5. Ubuntu 上寻找依赖库(.so)的方法
  6. 人人影视字幕组因盗版视频被查 涉案金额1600余万元
  7. linux用户管理和群界面怎么打开,Linux的用户和组群管理
  8. 自定义sql_基于Calcite自定义SQL解析器
  9. windows安装ODBC
  10. leetCode-458. Poor Pigs
  11. 用友u8反记账反结账如何处理
  12. 按键精灵手机版读取MYSQL_mysql,按键精灵,读取写入
  13. springmvc GET POST 接受参数方式
  14. JAVA多线程并发之线程实现,4种线程池,终止线程4种方式
  15. 请帮我查看一下2.19号邢台发往北京高铁的班次,以及各个班次的时间
  16. 省流版-38号车评中心历史车评文字汇总
  17. magic winmail邮件服务器,使用Magic Winmail Server轻松架设邮件服务器(一)-网管专栏,邮件服务...
  18. 「数据管理」顶级数据库管理系统供应商
  19. MSA/MSB定位流程
  20. soxr重采样实现变速

热门文章

  1. struts教程笔记1
  2. java整型_java整型数值
  3. pybind11用python调用C++代码
  4. oss读取指定文件夹下所有图片
  5. python实现xgboost算法
  6. Python爬取豆瓣网中即将上映的电影数据清单
  7. Pycharm和Anaconda中如何安装package
  8. 2021-08-15 Servlet Properties 读取资源
  9. 极大似然估计_一文理解机器学习中的极大似然估计(MLE)
  10. dotenv 是什么 怎么使用