J. Ceizenpok’s formula
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Dr. Ceizenp'ok from planet i1c5l became famous across the whole Universe thanks to his recent discovery — the Ceizenpok’s formula. This formula has only three arguments: n, k and m, and its value is a number of k-combinations of a set of n modulo m.

While the whole Universe is trying to guess what the formula is useful for, we need to automate its calculation.

Input

Single line contains three integers n, k, m, separated with spaces (1 ≤ n ≤ 1018, 0 ≤ k ≤ n, 2 ≤ m ≤ 1 000 000).

Output

Write the formula value for given arguments n, k, m.

Sample test(s)
input
2 1 3

output
2

input
4 2 5

output
1

/*
2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)求C(n,k)%m
如果m是素数的话直接就能套lucas模板.
对于m为合数,我们可以把它分解成素数在进行处理 m = p1*p2*p3..pk   (pk = prime[i]^t)
然后利用扩展lucas定理可以求出  C(n,k) % pi的值,最后利用中国剩余定理涨姿势:http://www.cnblogs.com/jianglangcaijin/p/3446839.html
题目链接:http://codeforces.com/gym/100633/problem/J
hhh-2016-04-16 13:07:05
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <functional>
typedef long long ll;
#define lson (i<<1)
#define rson ((i<<1)|1)
using namespace std;const int maxn = 1e6+10;
ll fac[maxn];
int w[maxn],num[maxn],tw[maxn];
int tot;
void get_factor(ll m)
{ll mm = m;tot = 0;for(ll i = 2; i*i <= m; i++){if(mm % i == 0){num[tot] = 0;w[tot] = i;tw[tot] = 1;while(mm % i == 0){num[tot]++;mm /= i;tw[tot] *= i;}tot++;}}if(mm > 1){num[tot] = 1;w[tot] = mm;tw[tot] = mm;tot ++;}
}ll ex_gcd(ll a,ll b,ll &x,ll &y)
{if(a == 0 && b == 0)return -1;if(b == 0){x = 1,y = 0;return a;}ll d = ex_gcd(b,a%b,y,x);y -= a/b*x;return d;
}ll pow_mod(ll a,ll b,ll mod)
{ll ret = 1;while(b){if(b&1) ret = ret*a%mod;a = a*a%mod;b >>= 1;}return ret;
}ll revers(ll a,ll b)
{ll x,y;ll d = ex_gcd(a,b,x,y);if(d == 1) return (x%b+b)%b;else return 0;
}ll c1(ll n,ll p,ll pk)
{if(n==0)return 1;ll ans=1;for(ll i = 2; i <= pk; i++)if(i % p)ans = ans*i%pk;ans=pow_mod(ans,n/pk,pk);for(ll k=n%pk,i=2; i<=k; i++)if(i%p)ans=ans*i%pk;return ans*c1(n/p,p,pk)%pk;
}ll cal(ll n,ll m,int cur,ll mod)
{ll pi = w[cur],pk = tw[cur];ll k = 0,ans;ll a,b,c;a=c1(n,pi,pk),b=c1(m,pi,pk),c=c1(n-m,pi,pk);for(ll i=n; i; i/=pi)k+=i/pi;for(ll i=m; i; i/=pi)k-=i/pi;for(ll i=n-m; i; i/=pi)k-=i/pi;ans = a*revers(b,pk)%pk*revers(c,pk)%pk*pow_mod(pi,k,pk)%pk;return ans*(mod/pk)%mod*revers(mod/pk,pk)%mod;
}ll lucas(ll n,ll m,ll mod)
{ll ans = 0;for(int i = 0; i < tot; i++){ans = (ans+cal(n,m,i,mod))%mod;}return ans;
}ll n,k;
ll m;
int main()
{int T;while(scanf("%I64d%I64d%I64d",&n,&k,&m) != EOF){get_factor(m);printf("%I64d\n",lucas(n,k,m));}return 0;
}

  

转载于:https://www.cnblogs.com/Przz/p/5409567.html

2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)相关推荐

  1. gym/100633/J Ceizenpok’s formula

    题意:给出n,m,p输出C(n,m)%p p不一定是素数 #include <iostream>//ex_Lucas模板 #include <cstdio> #include ...

  2. Codeforces Round #617 (Div. 3) E2. String Coloring (hard version) 思维 + dp + Dilworth定理

    传送门 文章目录 题意: 思路: 题意: 让你给一个串染色,不同颜色且相邻的一对字符可以互换位置,用最少的颜色,使交换后这个字符串字典序最小. 思路: 考虑将字符串分成若干个非递减的子序列,由于其非递 ...

  3. div不占位置_Python爬取校花网,妈妈再也不会担心我不给她发女朋友照片了

    一.概况 上一篇我们用一个表情网站入门了爬虫,爬了很多表情.今天我们继续在爬的路上,今天就爬个校花吧,毕竟妹子属于稀缺资源,要不妈妈总会问,你到底找不找女朋友了,爬点校花吧,以后跟妈妈聊天,可以哭着对 ...

  4. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

    题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...

  5. Educational Codeforces Round 80 (Rated for Div. 2) C. Two Arrays 组合数|dp

    传送门 文章目录 题意: 思路: 题意: 给你n,mn,mn,m,让你构造两个数组a,ba,ba,b满足:1<=ai,bi<=n1<=a_i,b_i<=n1<=ai​,b ...

  6. CERC2015 Frightful Formula 神奇的模意义下分数

    上网查了下这道题的正解是FFT......然而机智的xushu用待定系数法A了.... f[i,j]+k=a(f[i][j-1]+k)+b(f[i-1,j]+k) 解得 k=c/(a+b-1) 于是令 ...

  7. 「Note」Math not for OI

    大家以我为戒 千万不要这么学 oi ( todolist 会越鸽越长的 高代那部分莫名其妙写了一大堆 其实我写完之后也没复习过几遍.. 而且千万不要抄看起来很厉害实际上也很厉害的东西抄爽了,, 更不要 ...

  8. c语言编程规律数阵输出,趣味C程序100.9 绘制杨辉三角

    说明:1.本问题来源于,所有程序为本人自己编写.与原程序不同之处作有标记. 2.本系列所有程序均使用codeblocks编译,操作系统为Windows XP. 问题:在屏幕上显示杨辉三角 1 1  1 ...

  9. codeforces Kyoya and Colored Balls

    题解见:http://blog.csdn.net/libin56842/article/details/46650209 注意这里的组合数取模~~~ 1 /*Author :usedrose */ 2 ...

最新文章

  1. CentOS 7 搭建docker仓库
  2. GitLab 8.15中引入了自动部署和Web终端
  3. 计算机视觉领域最全汇总(第2部分)
  4. 奥运信息安全谁说了算?
  5. 机器学习 - 随机森林手动10 折交叉验证
  6. 4.4 Iterator(迭代器)
  7. signature=d5d679bcec778027f40bcf8a2796c61b,Processing damaged items using image data lift
  8. 压力大根源不在教育本身
  9. 认知机器人:机器人学
  10. Oracle数据库的备份方法
  11. winform的FormBorderStyle设置为None窗口的最小宽度不能小于132
  12. 评分卡模型开发(十)--总体流程
  13. 自学python入门训练营 李笑来_1901090043-自学训练营学习9群-PYTHON入门
  14. 用JS写小鸟飞行的游戏
  15. 《微信读书》自定义样式
  16. 百名学生教学用计算机,【敲敲黑板】本科教学合格评估知识学习之内涵解读 Day 13...
  17. 【毕业课程设计】基于PLC的立体仓库控制系统设计
  18. 多普达838,在关机状态下硬启的方法.
  19. 2021 mathematical modeling national competition question B
  20. 钟勇 中国科学院成都计算机研究所,中国科学院大学研究生导师教师师资介绍简介-钟勇...

热门文章

  1. 2020.12.15
  2. python登录系统的实现方法_python实现用户登录系统
  3. python 反向传值_Django中reverse反转并且传递参数的方法
  4. 计算机显示器不清楚跟电池有关系吗,电脑液晶显示器显像模糊是什么原因
  5. python列表的嵌套,Python检查列表是否嵌套
  6. easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单
  7. centos7启动dhcp失败_CentOs 7 搭建DHCP服务器 启动报错
  8. 11kw星三角启动延时几秒_电机星三角降压启动原理图
  9. java mp3 暂停,Java MP3播放器 - 使用jLayer播放,暂停和搜索不能正常工作
  10. mysql事务隔离级别与设置