时间限制 : - MS   空间限制 : - KB
评测说明 : 1s,128m
问题描述

每个人都会有幸运数字,有种幸运数字是这样定义的:
如果 X 是幸运数字,则 X 在 m 进制下的表示为 x1x2...xk,一定有 x1<=x2<=...<=xk,其 中 k 可以表示 X 在 m 进制下的位数。
这样的数字可能有无穷多个的,但是如果是在 m 进制下位数不超过 n 的幸运数字,就 应该是有限个了,你能算出来吗?
这个答案可能很大,你只需要输出答案对一个数 p 取模的值即可。

输入格式

共一行,三个正整数 n、m 和 p,保证 p 是质数。

输出格式

共一行,表示答案对 p 取模的值。

样例输入 1

4 3 23

样例输出 1

15

样例输入 2

4 10 10000079

样例输出 2

715

提示

前 20%的数据满足 n <= 18, m <= 10。
前 40%的数据满足 n <= 100, m <= 100。
前 60%的数据满足 n <= 1000, m <= 1000。
100%的数据满足 n <= 107, m <= 107, n + m <= p, p <= 10000079。

样例说明

样例 1 的 15 种方案如下:
0000,0001,0011,0111,1111,0002,0022,0222,2222,0012,0122,1222,1112,1122,1222

分析: 这题有一个很显然的DP 考试的时候由于纠结B题太久 没有打前缀和优化  掉了40分

20%搜索即可50%DP,f[i][j]表示以 j 结尾,长度为 i 的数字的个数。则 f[i][j]=sum{f[i-1][k]},k<=j,f[1][j]=1,复杂度 O(n^3)80%注意到前面求 f[i][j]时有求前缀和,那么用 g[i][j]表示 f[i][1]到 f[i][j]的和,则 dp 可以优化到O(nm)100%80 分的算法中,f[i][j]=g[i-1][j],也可以写成 g[i][j]-g[i][j-1]=g[i-1][j],即 g[i][j]=g[i-1][j]+g[i][j-1],这类似于一个杨辉三角形,并且发现边界 g[1][i]=i 恰好是杨辉三角形去掉最外层 1 的一边,因此可以使用组合数的方法进行直接计算 g[i][j]的值:g[i][j]=c(i,i+j-1);最终答案:ans=sum(g[i][m-1]),1<=i<=n根据 g[i][j]=g[i-1][j]+g[i][j-1]化简可以得到ans=g[n][m]=c(n,n+m-1)
至于g[i][[j] 为啥会得到C(i,i+j-1)  我只能说靠经验
然后分享一波 lucas定理板子
C(N,M)=C(N%P,M%P)*lucas(N/P,M/P);
虽然说n+m<=p 用不到lucas
code:

//
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,p;
ll ksm(ll a,ll b,ll c)
{ll ans=1;while(b){if(b&1) ans=ans%p*(a%p);b>>=1;a=(a*a)%c;}return ans%p;
}
ll c(int n,int m)
{if(n<m) return 0;if(n==m) return 1;if(n-m<m) m=n-m;ll A=1,B=1;for(int i=0;i<m;i++){A=(A%p)*(n-i)%p;B=(B%p)*(m-i)%p;}return ksm(B,p-2,p)*A;
}ll lucas(int n,int m,int p)
{if(m==0) return 1;elsereturn lucas(n/p,m/p,p)%p*c(n%p,m%p)%p;
}
int main()
{
//    freopen("lucknum.in","r",stdin);
//    freopen("lucknum.out","w",stdout);scanf("%lld%lld%lld",&n,&m,&p);printf("%lld",lucas(n+m-1,n,p)%p);
}

转载于:https://www.cnblogs.com/OIEREDSION/p/11261907.html

7.28 C幸运数字相关推荐

  1. 牛客网 牛客练习赛13 C.幸运数字Ⅲ-思维

    C.幸运数字Ⅲ 链接:https://www.nowcoder.com/acm/contest/70/C 来源:牛客网 这个题447和477是特殊的,其他的就没什么了. 代码: 1 #include& ...

  2. Bzoj4568: [Scoi2016]幸运数字

    Bzoj4568: [Scoi2016]幸运数字 线性基+倍增+LCA 原来线性基还能这么考--一开始看到这个题以为是树上差分线性基,然而线性基不支持删除,所以就挂了. 后来想到倍增线性基,其实到这里 ...

  3. [BZOJ4568][SCOI2016]幸运数字(倍增LCA,点分治+线性基)

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MB Submit: 2131  Solved: 865 [Submit][Sta ...

  4. bzoj1853: [Scoi2010]幸运数字 dp+容斥原理

    在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是"幸运号 ...

  5. lintcode1385. 幸运数字8

    8是小九的幸运数字,小九想知道在1~n的数中有多少个数字含有8. 样例1输入: n = 20 输出: 2 解释: 只有8,18 含有8. 样例2输入: n = 100 输出: 19 解释: 有8,18 ...

  6. [SCOI2016]幸运数字

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征. 一些旅行者希望 ...

  7. [SCOI 2016]幸运数字

    Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...

  8. LintCode题目:幸运数字8

    URL :https://www.lintcode.com/problem/lucky-number-eight/description 描述 8是小九的幸运数字,小九想知道在1~n的数中有多少个数字 ...

  9. 幸运数字8 - LintCode

    描述 8是小九的幸运数字,小九想知道在1~n的数中有多少个数字含有8. 1 <= n <= 1000000 样例 给出 n = 20, 返回2. 解释: 只有8,18 含有8. 给出 n ...

最新文章

  1. Open Flash Chart组件的使用 及 与 jfreechart, FusionCharts 的比较
  2. 当量子计算和机器学习相遇,会碰撞出什么火花?
  3. Java版本多用户B2B2C商城源码-(八)消息总线(Spring Cloud Bus)
  4. 可重入锁ReentrantLock--转载
  5. Linux Red Hat 6.0 配置网卡ip地址和备用ip地址
  6. 训练吞吐量提升6倍!飞桨弹性计算推荐系统套件ElasticCTR1.0发布
  7. python深浅拷贝的底层理解_理解python中的深拷贝与浅拷贝
  8. .Net (C#)委托和事件(获取多个返回值)
  9. Redis(五):List集合数据类型详解
  10. 【批处理】通过bat文件执行python程序
  11. 监听滚动条和浏览器大小变化
  12. 王道计算机考研——计算机组成原理笔记
  13. OpenSesame免费提供新冠病毒防疫准备和远程工作培训
  14. 高斯-勒让德求积公式及Matlab实现
  15. 剪映+json解析将视频中的声音转换成文本
  16. 牛客网_java选择题
  17. 浅谈禁忌搜索(TabuSearch)
  18. 清华天才王垠受邀面试阿里P9,被阿里P10赵海平面跪,传言阿里P10赵海平被P11多隆判定3.25离职,整个事件回顾......
  19. Java实现AES工具类(包含CBC和ECB)
  20. 漂亮的许愿墙网站源码

热门文章

  1. linux 修改hosts立即生效设置
  2. IText生成PDF
  3. ChatGPT 从入门到精通
  4. 好不容易找到的一篇dva教程
  5. iOS内存扫描工具实现
  6. JavaScript 是怎么运行起来的?
  7. 新零售新模式:完整了解「快闪店」运作
  8. uilabel 左上对齐_UILabel一行居中对齐与多行左对齐
  9. 个人网站引入B站视频播放,个人博客播放B站视频。【1080P】
  10. unity_插屏广告