原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-1000.html

SRM500 Div1 1000

设 \(v_1,v_2,\cdots ,v_9\) 分别为一个数中 \(1-9\) 的出现次数。

那么可以列出如下方程组:

\[\begin{eqnarray*}
v_1+2v_2+3v_3+\cdots +9v_9 &=& S\\
v_2+2v_4+3v_8+v_6 &=& p_2\\
v_3+v_6+2v_9 &=& p_3\\
v_5 &=& p_5\\
v_7 &=& p_7
\end{eqnarray*}
\]

有 9 个变量,5 个方程,所以只需要枚举其中 4 个就可以得到所有的。于是问题被转化成了知道 \(v_1\cdots v_9\),求这些数对答案的贡献。先假设所有的 \(t=\sum_{1\leq i \leq 9}v_i\) 个数都互不相同,则任意一个数在任意一个位置都会产生 \((t-1)!\) 次贡献,所以总贡献为 \(a=(\sum_{0\leq i <t} 10 ^i)(\sum_{1\leq i\leq 9}iv_i)((t-1)!)\) 。由于值相同的数是等价的,所以最终得到的贡献为 \(a/(\prod _{1\leq i \leq 9}v_i!)\) 。

代码

static const int N=3005,mod=500500573;
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
int Fac[N],Inv[N],Iv[N],sum[N];
void prework(int n){
for (int i=Fac[0]=1;i<=n;i++)
Fac[i]=1LL*Fac[i-1]*i%mod;
Inv[n]=Pow(Fac[n],mod-2);
for (int i=n;i>=1;i--)
Inv[i-1]=1LL*Inv[i]*i%mod;
for (int i=1;i<=n;i++)
Iv[i]=1LL*Inv[i]*Fac[i-1]%mod;
sum[0]=0;
for (int i=1;i<=n;i++)
sum[i]=(10LL*sum[i-1]+1)%mod;
}
int v1,v2,v3,v4,v5,v6,v7,v8,v9;
int calc(){
static int t;
t=v1+v2+v3+v4+v5+v6+v7+v8+v9;
return 1LL*Fac[t-1]*sum[t]%mod
*(v1*1+v2*2+v3*3+v4*4+v5*5+v6*6+v7*7+v8*8+v9*9)%mod
*Inv[v1]%mod*Inv[v2]%mod*Inv[v3]%mod
*Inv[v4]%mod*Inv[v5]%mod*Inv[v6]%mod
*Inv[v7]%mod*Inv[v8]%mod*Inv[v9]%mod;
}
int getSum(int p2, int p3, int p5, int p7, int S){
prework(3000);
int ans=0;
S-=p5*5+p7*7;
v5=p5,v7=p7;
for (v2=0;v2<=p2;v2++)
for (v4=0;v2+v4*2<=p2;v4++)
for (v8=0;v8*3+v4*2+v2<=p2;v8++){
v6=p2-v2-v4*2-v8*3;
int s2=S-v2*2-v4*4-v8*8-v6*6;
if (s2<0||p3<v6)
continue;
for (v9=(p3-v6)/2;v9>=0;v9--){
v3=p3-v6-v9*2;
v1=s2-v9*9-v3*3;
if (v1<0)
continue;
ans=(ans+calc())%mod;
}
}
return ans;
}

TopCoder SRM500 Div1 1000 其他的更多相关文章

  1. TopCoder SRM500 Div1 250 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-250.html SRM500 Div1 250 题意 (看题用了半个小时--) 有 n 个人(编号 ...

  2. TopCoder SRM500 Div1 500 分治

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-500.html SRM500 Div1 500 没想到 double 的精度居然没有爆-- 考虑以 ...

  3. TopCoder SRM502 Div1 1000 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...

  4. TopCoder 649 div1 & div2

    最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...

  5. TopCoder SRM502 Div1 500 贪心 01背包

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-500.html SRM502 Div1 500 好题. 首先,如果已经确定了解决所有问题的优先级, ...

  6. topcoder SRM712 Div1 LR

    题目: Problem Statement      We have a cyclic array A of length n. For each valid i, element i-1 the l ...

  7. TopCoder 603 div1 & div2

    div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...

  8. TopCoder SRM704 Div1 800 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM704-800.html 题解 考虑构造一个 $n = 20$ 的图. 先把所有 $i$ 都连向 $i-1$ ...

  9. topcoder SRM642 div1 hard WheelofFortune

    题目链接:vjudge 大意:有两个人参加一场游戏,这个游戏在一个编号为\(0\text~n-1\)的轮盘上进行,一开始轮盘上的数字均为0:一共有\(m\)轮,每一轮都有一个操作参数\(s_i\),主 ...

随机推荐

  1. js -- sort() 使用排序函数

    JavaScript sort() 方法 JavaScript Array 对象 定义和用法 sort() 方法用于对数组的元素进行排序. 语法 arrayObject.sort(sortby) 参数 ...

  2. input错误提示,点击提交,提示有未填项,屏幕滑到input未填项的位置

    function errorInfo(parm) { //获取文本框值 var $val = parm.val(); if ($val==""||undefined||null){ ...

  3. Codeforces 1132G Greedy Subsequences [线段树]

    洛谷 Codeforces 看到题解那么少就来发一篇吧-- 思路 看完题目一脸懵逼,感觉无从下手. 莫名其妙地想到笛卡尔树,但笛卡尔树好像并没有太大作用. 考虑把笛卡尔树改一下:每个点的父亲设为它的右 ...

  4. 【进阶4-2期】Object.assign 原理及其实现 (转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记  https://github.com/yygmind/blog/issues/26 浅拷贝 Object.assign 上篇文章介绍了其定义和使 ...

  5. Android 组件化方案探索与思考

    Android 组件化方案探索与思考 组件化项目,通过gradle脚本,实现module在编译期隔离,运行期按需加载,实现组件间解耦,高效单独调试. 本项目github地址 https://githu ...

  6. Java 的 Api 文档生成工具 JApiDocs 程序文档工具

    JApiDocs 详细介绍 简介 JApiDocs 是一个符合 Java 编程习惯的 Api 文档生成工具.最大程度地利用 Java 的语法特性,你只管用心设计好接口,添加必要的注释,JApiDocs ...

  7. Nginx的进程模型及高可用方案(OpenResty)

    1. Nginx 进程模型简介 Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程.其中master充当整个进程组与用户的交互接口,同时对进程进行监护 ...

  8. MySQL5.7版本及以上,改密码sql语句;grant创建用户已经密码

    mysql> update mysql.user set authentication_string = password('*****')  where user = 'root'; gran ...

  9. MySQL架构及SQL语句

    MySQL基础: 单进程多线程: 用户连接:连接线程 官方组件架构: MySQL的数据文件类型: 数据文件.索引文件 重做日志.撤销日志.二进制日志.错误日志.查询日志.慢查询日志.中继日志 MySQ ...

  10. C++ Primer 笔记——OOP

    1.基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此. 2.任何构造函数之外的非静态函数都可以是虚函数,关键字virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定 ...