[SDOI2010] 代码拍卖会 题解
[SDOI2010] 代码拍卖会 题解
题目描述
一个
求这些数中可以被
解析
这个数一定形如
最多有
现在问题转换成有
我们可以有一种背包计数的 dp 想法,但看起来
我们把每个物品按照对
然后记录
循环节的计算
那么怎么计算
普及组知识?
定义
如
则显然有
显然这柿子在
可以把
-
未进入循环段
-
循环段
-
不完整循环段
暴力统计 未进入和不完整 的,用循环节搞定循环的就好了。
计数
我们不关心这个物品具体是什么,我们只需要保证物品求和去模之后为
假如
7 个模数为 1 ,2 个模数为 6,或者 3 个模数为5,4 个模数为 1,
这一类的情况都是我们想要的。
总的来说,我们要物品总数
我们设
答案很显然是:
转移也很简单了。
枚举当前价格为
转移的最后一维减法是在模意义下的。
最后一个组合数代表着 从
为什么是这个,考虑插板法。
组合数
从
相当于解方程
我们把所有的
现在有
所以
上图代表着从 5 个数中选 4 个的其中一种方案。
温馨提示
因为猪猪不可以选0,所以第一个一定是
我代码中的因为模数
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 999911659;
ll n,g[510],f[510][10][510];
int p,d,jl;
vector<int> v[510];
ll qpow(ll x,int k){
ll ans = 1;
while(k){
if(k & 1) ans = ans * x % mod;
x = x * x % mod;
k >>= 1;
}
return ans;
}
ll C(ll n ,ll m){
if(m < 0) return 0;
ll fz = 1 ,fm = 1;
for(ll i = 1; i <= m; ++i){
fz = fz * (n - i + 1) % mod;
fm = fm * i % mod;
}
return fz * qpow(fm ,mod - 2) % mod;
}
void pre(){
int now = 0;
for(int i = 1; i <= 2 * p; ++i){
now = (now * 10 + 1) % p;
v[now].push_back(i);
}
for(int i = 0; i < 500; ++i){
g[i] = 0;
if(v[i].size() == 0 || v[i][0] > n) continue;
if(v[i].size() == 1){
g[i] = v[i].size();
continue;
}
d = v[i][1] - v[i][0];
g[i] = (((n - v[i][0]) / d) + 1 ) % mod;
if((n - v[i][0]) % d == 0){
jl = i;
}
}
}
void op(){
for(int i = 0; i <= p ; ++i) f[i][0][0] = 1;
for(int i = 1; i <= p; ++i){
for(int j = 1; j <= 8; ++j){
for(int k = 0; k <= 1ll * j; ++k){
ll mul = C(g[i - 1] + k - 1,k);
if(k > 0 && g[i - 1] == 0) break;
for(int s = 0; s < p; ++s){//这里换一下dp顺序先枚举 k 在枚举 d 不然算组合数要超时
f[i][j][s] += mul * f[i - 1][j - k][(s - k * (i - 1) % p + p) % p] % mod;
f[i][j][s] %= mod;
}
}
}
}
}
void output(){
ll ans = 0;
for(int i = 0; i <= 8; ++i){
ans = (ans + f[p][i][(p - jl) % p]) % mod;
}
cout<<ans;
}
int main(){
cin>>n>>p;
pre();
op();
output();
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战