题意:
从杨辉三角的顶端走到所给定的位置,即相当于坐标(n,k),问到这儿的路径最小数字之和是多少.结果对p取模 (0<=k<=n<10^9) (p<10^4)

   0. 知道杨辉三角所在的(n,k)标位置的数字就是C(n,k),
   1. 走尽可能多的1
   2.  当2k<=n时,找规律就是 n-k+C(n+1,k) (见附)
   3.  当2k>n时,就是 k+C(n+1,k+1);因为k比较大,就转化为计算k+C(n+1,n-k)
   4.  因为p比较小,且是素数,所以可以在求组合数的时候可以对阶乘和逆元预处理!
   记得hdu上好像确实有一道这样的题,用递推dp来求解走过的路径的最值,不过数据没这么大

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
//#define IO  ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
//#pragma comment(linker, "/STACK:1024000000,1024000000")
void ex_gcd(int a, int b, int &d, int &x, int &y) { if (!b) { x = 1; y = 0; d = a; } else { ex_gcd(b, a%b, d, y, x); y -= x * (a / b); }; }
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
int lcm(int a,int b){return a/gcd(a,b)*b;}
int inv_exgcd(int a, int m) { int d, x, y;ex_gcd(a, m, d, x, y);return d == 1 ? (x + m) % m : -1; }
typedef long long ll;
const int maxn=1e4+10;
using namespace std;
int primer[maxn];
ll fac[maxn][maxn];//x=fac[i][j] (j! ≡ x mod i)
ll inv[maxn][maxn];//逆元:x=inv[i][j], (j!*x ≡ 1 mod i)
ll a[maxn];
ll n,m,mod,cnt=0;
void isprime()
{for(int i=2;i<maxn;++i){if(!a[i]){ primer[cnt++]=i;for(int j=2*i;j<=maxn;j+=i)a[j]=1;}}
}
void init()//预处理阶乘和逆元
{for(int i=0;i<cnt;++i){fac[primer[i]][0]=inv[primer[i]][0]=1;for(int j=1;j<primer[i];++j){//fac计算j!%mod,是由(j-1)!*j%mod递推而来fac[primer[i]][j] = (fac[primer[i]][j-1] * j) % primer[i];inv[primer[i]][j] = inv_exgcd(fac[primer[i]][j],primer[i]);}}
}
ll C(ll n,ll m,ll mod)
{if(m>n)return 0;if(n==m)return 1;return fac[mod][n]*(inv[mod][m]*inv[mod][n-m]%mod)%mod;  //C(n,m)=n!/(m!*(n-m)!) fac[mod][n]就是在n!下取模后的结果//    ll ans=fac[n]*inv_exgcd((fac[m]*fac[n-m])%mod,mod);
//    return ans%mod;
}
ll Lucas(ll n,ll m,ll mod)
{if(m==0)return 1;return C(n%mod,m%mod,mod)*Lucas(n/mod,m/mod,mod)%mod;
}
int main()
{isprime();init();int t=0;while(scanf("%lld%lld%lld",&n,&m,&mod)!=EOF){if(2*m>n) m=n-m;ll lu=Lucas(1+n,m,mod);printf("Case #%d: %lld\n",++t,(lu+n-m)%mod);}return 0;
}

 附:
c(n-k,0)+c(n-k+1,1)+c(n-k+2,2)+...+c(n-k+i,i)+...+c(n,k)+n-k
=c(n-k+1,0)+c(n-k+1,1)+c(n-k+2,2)+...+c(n-k+i,i)+...+c(n,k)+n-k
=c(n-k+2,1)+c(n-k+2,2)+...+c(n-k+i,i)+...+c(n,k)+n-k
=c(n-k+3,2)+...+c(n-k+i,i)+...+c(n,k)+n-k
=c(n-k+i,i-1)+...+c(n-k+i,i)+c(n,k)+n-k
=               ...
=c(n,k-1)+c(n,k)+n-k
=c(n+1,k)+n-k

C(0,0)                                                                               1
C(1,0) C(1,1)                                                                     1  1
C(2,0) C(2,1) C(2,2)                                                          1  2  1
C(3,0) C(3,1) C(3,2) C(3,3)                                               1  3  3  1
C(4,0) C(4,1) C(4,2) C(4,3) C(4,4)                                    1  4  6  4  1
C(5,0) C(5,1) C(5,2) C(5,3) C(5,4) C(5,5)                         1  5  10 10 5  1
C(6,0) C(6,1) C(6,2) C(6,3) C(6,4) C(6,5) C(6,6)              1  6  15 20 15 6  1
C(7,0) C(7,1) C(7,2) C(7,3) C(7,4) C(7,5) C(7,6) C(7,7)    1  7  21 35 35 21 7  1 

hdu-3944 DP?相关推荐

  1. hdu 3944 DP? (Lucas 定理)

    仔细观察杨辉三角后可以发现从最高点到第n行第k个数的最短路为c(n+1,k); 根据Lucas定理可以求出,一般来说要求答案模去一个质数p且p的范围不大于10^5则可用Lucas. Lucas(n,m ...

  2. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  3. hdu 1171 dp(多重背包)

    View Code //hdu 1171 dp(多重背包)//题意:把所有物品的价值尽量分为相等的两份,不能等分的话 //后面那份可以稍小于前面的 //求出价值总和后,令价值的一半为背包容量,让背包尽 ...

  4. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行.竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  5. hdu 5086(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5086 题目大意:给出长度为n的数组,然后要求累计里面的每个子串的和. 解题思路:这道题直接枚举肯定不行 ...

  6. hdu 2059(dp)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

  7. HDU 3646 DP + 二分

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3646 题意:你有N把武器,每把武器可以对敌人造成一定的伤害(et:攻击力500,敌人血量为200,杀死敌人 ...

  8. Hdu 4293 DP

    题意: n个人说自己前面有多少人 后面有多少人 求出说真话人数最多的情况 每个样例有 一个 n 表示n个人 接下来 n 行有a b 表示他前面的人数和后面的人数 思路: 如果已经知道了其中一组的人数~ ...

  9. hdu 3905(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3905 思路:dp[i][j]表示前i分钟,睡了j分钟收获的的最大价值,并记tmp_dp[i][j]为从 ...

  10. hdu 4472 dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4472 第一直觉找规律,第二直觉 把树拆成子树,然后递推或者DP 然后发现不行,然后才发现自己题都没读,,,, d ...

最新文章

  1. Ubuntu14.04 64位机上安装OpenCV2.4.13(CUDA8.0)版操作步骤
  2. python数据结构之树
  3. “横平竖直”进行连线+将相邻框进行合并
  4. 《走出软件作坊》读后感
  5. 【Python】shuffle函数
  6. 数据流中的中位数java_数据流中的中位数
  7. java怎么定义scanner_Java Scanner类的常用方法及用法(很详细)
  8. 软媒魔方 v6.2.1.0 绿色纯净版及经典版
  9. 云服务综合解决方案——云桌面
  10. 一款非常强大的vlc多媒体视频播放器:VLC Media Player for mac
  11. 处理 JS中 undefined 的7个技巧
  12. 【juns项目】信用卡数据项目2-1:需求和效果展示
  13. Spring Data JPA + QueryDSL
  14. 导航地图是怎样绘制出来的?
  15. DataGrid 动态绑定URL地址,在WebConfig中配置
  16. 华为CANN训练营_昇腾AI入门课笔记
  17. Linux命令行下修改文件或文件夹名
  18. java swing 网格布局
  19. RUA!ERROR!
  20. 分区数据丢失怎么恢复?恢复磁盘分区数据的方法

热门文章

  1. UNP Chapter 9 - 基本名字与地址转换
  2. 【无标题】服务机器人---SLAM算法之gmapping
  3. 服务机器人---充电桩
  4. python常用的集成开发环境有哪些_python IDE有哪些?哪个好用?
  5. python不带颜色的图形_如何使用Matplotlib设置图形背景颜色的不透明度 - python
  6. java B2B2C Springcloud电子商城系统-通过消息队列传输zipkin日志
  7. CSVHelper在Asp.Net MVC中的使用
  8. 「shell」替代rm,放入回收站
  9. emiya-canvas.js 解决ios下拍照倾斜与canvas高清屏下绘图模糊问题 1
  10. Python网络数据采集