1974: [Sdoi2010]auction 代码拍卖会

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit:
305  Solved: 122
[Submit][Status][Discuss]

Description

随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库。猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库。iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关系好又肯出钱的小猪,于是他决定举行了一个超大型拍卖会。
在拍卖会上,所有的N头小猪将会按照和iPig的好感度从低到高,从左到右地在iPig面前站成一排。每个小猪身上都有9猪币(与人民币汇率不明),从最左边开始,每个小猪依次举起一块牌子,上面写上想付出的买代码库的猪币数量(1到9之间的一个整数)。大家都知道,如果自己付的钱比左边的猪少,肯定得不到梦寐以求的代码库,因此从第二只起,每只猪出的钱都大于等于左边猪出的价钱。最终出的钱最多的小猪(们)会得到iPig的代码库真传,向着保送PKU(Pig
Kingdom University)的梦想前进。
iPig对自己想到的这个点子感到十分满意,在去现场的路上,iPig就在想象拍卖会上会出现的场景,例如一共会出现多少种出价情况之类的问题,但这些问题都太简单了,iPig早已不敢兴趣了,他想要去研究更加困难的问题。iPig发现如果他从台上往下看,所有小猪举的牌子从左到右将会正好构成一个N位的整数,他现在想要挑战的问题是所有可能构成的整数中能正好被P整除的有多少个。由于答案过大,他只想要知道答案mod999911659就行了。

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种。
数据规模
测试点 N P 测试点 N P
1 ≤1000 ≤500 6
≤10^6 ≤500
2 ≤10^18 5 7 ≤10^18 ≤120
3 ≤10^18 ≤10 8 ≤10^18 ≤500
4 ≤10^18
≤10 9 ≤10^18 ≤500
5 ≤10^18 25 10 ≤10^18 ≤500

HINT

 

Source

Sdoi2010 Contest2 Day2

Solution

数据范围和题目描述,一开始以为是数位DP,发现其实不是    折越

发现从左到右每一位不减,那么有个不错的性质,可以组成的数,拆成${1,11,111,1111....}$中取$<=8$个数组合出来

而这些数%p,最多有p种可能,那么找循环,DP,用组合数计算一下答案即可

那么方程就是$dp[i][j][k]$表示前i种可能选了j个,组合出来的数%p结果为k的方案数

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define mod 999911659
long long n;int p,a,ans;
long long dp[][][],inv[],c[][],data[],cnt[];
long long C(long long x,int y)
{
if (y>x) return ;
long long re=;
for (long long i=x-y+; i<=x; i++)
(re*=(i%mod))%=mod;
return re*inv[y]%mod;
}
void GetInv()
{
inv[]=,inv[]=;
for (int i=; i<=; i++)
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for (int i=; i<=; i++)
inv[i]=inv[i]*inv[i-]%mod;
}
int main()
{
scanf("%lld%d",&n,&p);
GetInv();
int x=%p,sz=;
while (!cnt[x]) {cnt[x]=++sz; data[sz]=x; if (sz>=n) break; x=(x*+)%p;}
if (sz!=n)
{
long long N=n-cnt[x]+; int SZ=sz-cnt[x]+;
if (SZ>) a=(p-data[cnt[x]+(N%SZ?N%SZ:SZ)-])%p;
else a=(p-data[cnt[x]])%p;
for (int i=,t=cnt[x]; i<p; i++)
if (cnt[i])
if (cnt[i]<t) cnt[i]=;
else
if (SZ> && (N%SZ)>cnt[i]-t)
cnt[i]=N/SZ+; else cnt[i]=N/SZ;
}
else
{
a=(p-x)%p;
for (int i=; i<p; i++) if (cnt[i]) cnt[i]=;
}
for (int i=; i<p; i++)
for (int j=; j<; j++)
if (cnt[i]) c[i][j]=C(cnt[i]+j-,j);
dp[][][]=;
int now=;
for (int i=; i<p; i++)
if (cnt[i])
{
now^=;
for (int j=; j<; j++)
for (int k=; k<p; k++)
dp[now][j][k]=dp[now^][j][k];
for (int j=; j<; j++)
for (int k=; k<p; k++)
if (dp[now^][j][k])
for (int l=; l<-j; l++)
(dp[now][j+l][(k+l*i)%p]+=dp[now^][j][k]*c[i][l]%mod)%=mod;
}
for (int i=; i<; i++)
ans=(ans+dp[now][i][a])%mod;
printf("%d\n",ans);
return ;
}

这道题吼啊!

【BZOJ-1974】auction代码拍卖会 DP + 排列组合的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

  5. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  6. G.subsequence 1(dp + 排列组合)

    subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...

  7. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...

  8. LightOJ1005 Rooks(DP/排列组合)

    题目是在n*n的棋盘上放k个车使其不互相攻击的方案数. 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车. dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0 ...

  9. HDU 5816 状压DP&排列组合

    ---恢复内容开始--- Hearthstone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

随机推荐

  1. mysql中判断记录是否存在方法比较

    我这里总结了判断记录是否存在的常用方法: sql语句:select count(*) from tablename; 然后读取count(*)的值判断记录是否存在.对于这种方法性能上有些浪费,我们只是 ...

  2. Linux虚拟机突然不能上网了

    之前是可以的,然后这次打开突然不能上网了. 更改配置后就好了: 配置如下: 我的问题是打开打开之后变成了OFF不是ON了.然后不管怎么改变O都失败了. 改为: 这样虚拟机这边就好了. 我们看下wind ...

  3. POJ 1743 Musical Theme

    感觉最近好混乱......各种OJ都刷一点,感觉不太好......尤其是这种英文题 这道题一开始还没有看懂.听了ljh大犇的解释后终于明白了.下面我为英语和我一样的人翻译一下题面: 输入n个数.求最长 ...

  4. Windows 8.1 新增控件之 AppBar

    Windows 8.1 与Windows 8 相比已经有了很多改进,从ITPro 角度这篇文章<What's New in Windows 8.1>已经表述的很详细.对开发者来说,最明显的 ...

  5. U3D杂记

    1,点击UI上的登录按钮,从脚本发出ioo.netmanager.SendConnet->进入CS->soketclient.sendconnet...->netmanager调用 ...

  6. Mysql的操作说明

    Mysql对于用户的操作权限的控制都在:mysql.user表中 User字段:表示用户名称: Host字段:表示允许该用户访问的地址,可以是域名(如localhost).主机名.ip和%:%表示不限 ...

  7. python数字图像处理(18):高级形态学处理

    形态学处理,除了最基本的膨胀.腐蚀.开/闭运算.黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等. 1.凸包 凸包是指一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含 ...

  8. Nutch搜索引擎系列(目录)

    下面是Nutch搜索系列目录,希望对研究Nutch的同学有所帮助. 目录安排: 1)Nutch搜索引擎(第1期)_ Nutch简介及安装[下载] 2)Nutch搜索引擎(第2期)_ Solr简介及安装 ...

  9. 读书摘要,一种新的黑客文化:programming is forgetting

    http://opentranscripts.org/transcript/programming-forgetting-new-hacker-ethic/ 这篇文章非常有意思,作者是一个计算机教师, ...

  10. swifttextfield代理方法

    //MARK:textfield delegate //键盘的高度 func textFieldShouldBeginEditing(textField: UITextField) -> Boo ...