Bzoj1974 [Sdoi2010]auction 代码拍卖会
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 375 Solved: 151
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
Sample Output
样例解释
方案可以是: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
动规 分组背包
好题,神题,神到让人心生绝望。
首先要知道利用数列中数字不减小的性质能做点什么。
——可以根据这一性质把数列拆成:
0
1
11
111
1111
...
11111111111
这些数中任取9个累加的形式。
而这些全由1构成的数有一个特殊性质:随着1个数的递增,它们模一个数的结果会构成循环。那些直接想到的人有多强
那么就可以算出余数相同的数有多少个,将问题转化成分组背包
同一组中的数的效果等价,所以累加方案的时候算组合数就可以,组合数当然不能递推咯,需要用公式算。模意义下组合数公式需要乘逆元,而逆元不能用公式算(复杂度太高),那就需要递推咯
---逆元递推---
inv[1]=1
for(int i=2;i<=9;i++){inv[i]=((-(mod/i)*inv[mod%i])%mod+mod)%mod;}
----
A掉之后我在想,如果70行不用memset,而是直接继承上一次的状态,会不会更快一点 (如71-75行)?
↑但改成那样写之后反而WA了,发现是79行算完的结果没有就地取mod
↑那我之前是怎么AC的
↑玄学
/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
const int mod=;
const int mxn=;
LL f[][][];
LL n;int m;
LL cnt[mxn],w[mxn];
LL c[mxn][mxn];
LL inv[mxn];
int add,ans;
void Inv_init(){//逆元
inv[]=;
for(int i=;i<=;i++){inv[i]=((-(mod/i)*inv[mod%i])%mod+mod)%mod;}
for(int i=;i<;i++)inv[i]=inv[i]*inv[i-]%mod;
return;
}
LL clc(LL u,LL d){//组合数
if(!d)return ;
if(d>u)return ;
LL res=;
for(LL i=u-d+;i<=u;i++)res=res*(i%mod)%mod;
res=res*inv[d]%mod;
return res;
}
int main(){
int i,j;
scanf("%lld%d",&n,&m);
Inv_init();
LL x=%m;//%k以排除k==1的情况
int tot=;
while(!cnt[x]){//寻找循环节
cnt[x]=++tot;w[tot]=x;
if(tot>=n)break;
x=(x*+)%m;
}
if(tot<n){//出现循环
LL len=n-cnt[x]+;//剩余长度
int sz=tot-cnt[x]+;//循环部分长度
if(sz>)
add=(m-w[cnt[x]+((len%sz)?len%sz:sz)-])%m;
else add=(m-w[cnt[x]])%m; int tmp=cnt[x];
for(i=;i<m;i++){
if(cnt[i]){
if(cnt[i]<tmp)cnt[i]=;//未循环部分单独分组
else if(sz> && (len%sz)>cnt[i]-tmp)cnt[i]=len/sz+;
else cnt[i]=len/sz;
}
}
}
else{//若n个数不构成循环
add=(m-x)%m;
for(i=;i<m;i++)if(cnt[i])cnt[i]=;
}
for(i=;i<m;i++)
if(cnt[i]) for(j=;j<;j++) c[i][j]=clc(cnt[i]+j-,j); f[][][]=;
int tmp=;
for(i=;i<m;i++){
if(cnt[i]){
tmp^=;
memset(f[tmp],,sizeof f[tmp]);
/* for(j=0;j<9;j++){
for(int k=0;k<m;k++){
f[tmp][j][k]=f[tmp^1][j][k];
}
}*/
for(j=;j<;j++){
for(int k=;k<m;k++){
for(int l=;l<-j;l++){
(f[tmp][j+l][(k+l*i)%m]+=f[tmp^][j][k]*c[i][l]%mod)%=mod;
}
}
}
}
}
for(i=;i<;i++)ans=(ans+f[tmp][i][add])%mod;
printf("%d\n",ans);
return ;
}
Bzoj1974 [Sdoi2010]auction 代码拍卖会的更多相关文章
- 【BZOJ-1974】auction代码拍卖会 DP + 排列组合
1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 305 Solved: 122[Submit ...
- BZOJ 1974: [Sdoi2010]auction 代码拍卖会( dp )
在1, 11, 111……中选<=8个, + 11..(n个1)拼出所有可能...这些数mod p至多有p中可能, 找出循环的处理一下. 那么dp就很显然了...dp(i, j, k)表示前i种 ...
- BZOJ 1974 [Sdoi2010] auction 代码拍卖会(数位dp)
题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...
- BZOJ 1974 [Sdoi2010]auction 代码拍卖会 ——动态规划
把每一位上不递减的数拆成1+11+11111+11111+..... 然后就可以把巨大的N从复杂度中消掉,因为随着长度的增加1...111%p出现了循环节. 然后就是从n个数中选出几个使他们结果为0( ...
- SDOI2010代码拍卖会 (计数类DP)
P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...
- [BZOJ1974][SDOI2010]代码拍卖会[插板法]
题意 询问有多少个数位为 \(n\) 的形如 \(11223333444589\) 的数位值不下降的数字在\(\mod p\) 的意义下同余 \(0\). $n\leq 10^{18} ,p\leq ...
- [SDOI2010]代码拍卖会
题目描述 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关 ...
- bzoj 1974: [Sdoi2010]代码拍卖会
Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代 码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPi g不想把代码库给所有想要的小猪,只想 ...
- 洛谷 P2481 [SDOI2010]代码拍卖会
洛谷 这大概是我真正意义上的第一道黑题吧! 自己想出了一个大概,状态转移方程打错了一点点,最后还是得看题解. 一句话题意:求出有多少个\(n\)位的数,满足各个位置上的数字从左到右不下降,且被\(p\ ...
随机推荐
- Spring Cloud 入门 Eureka-Server服务注册
这里就不介绍怎么创建springboot项目了,可以查看我前面的博客 Spring Cloud Eureka Spring Cloud Eureka是Spring Cloud Netflix项目下的服 ...
- formpanel布局的学习
FormPanel有两种布局:form和column,form是纵向布局,column为横向布局.默认为后者.使用layout属性定义布局类型.对于一个复杂的布局表单,最重要的是正确分割,分割结果直接 ...
- thinkphp 3.2.3 程序执行时序图
- vue之小小动态按钮
Vue是前台框架,可以独立完成前后端分离式web项目渐进式的javascript框架 ,今天我们来设计一个简单的动态按钮 具体效果图如下: 点击后会变成这样: 首先我们需要下载vue.js:htt ...
- kubernetes中使用ServiceAccount创建kubectl config 文件
在kubernetes 为不同的项目创建了不同的SerivceAccount,那么如何通过ServiceAccount创建 kubectl config文件呢?使用下面脚本即可 # your serv ...
- C#开发模式——dll多级引用的问题
C#解决方案里有两种引用方式,项目引用和dll物理文件引用. 一.项目引用 严格引用,项目文件需包含在解决方案里,好处是便于调试,可直接进入代码.缺点是耦合度太高(必须全部编译通过才能run起来),项 ...
- day10 消息队列,多进程和多线程以及协程,异步IO,事件驱动等
回顾一下线程和进程 线程与进程的区别 守护线程: 队列: 两种方式: 先进先出 # 后入先出 #卖水果,后来的来的是新的 生产者消费者模型: 生产包子, 吃包子 事件 event: 红绿灯模型 ...
- 部署 Windows PowerShell Web 访问
部署 Windows PowerShell Web 访问 适用对象:Windows Server 2012, Windows Server 2012 R2 Windows PowerShell® We ...
- NOS直传加速服务
本文来自网易云社区 作者:孙建良 最近团队在对存储系统做一些性能测试,期间遇到了不少问题,测试过程中得出的结果也没有很好的数据支撑,所以尝试了非常多的方法来对性能问题进行定位. 小王童鞋是挺厉害的,使 ...
- C# 引用访问权限
同样代码表现的不同行为 创建基类(Super)和派生类(Sub)每个类有一个字段field和一个公共方法getField,并且使用内联的方式初始化为1,方法getField返回字段field.C#和J ...