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;
}

  

2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)的更多相关文章

  1. 2015 ICL, Finals, Div. 2【ABFGJK】

    [题外话:我......不补了......] 2015 ICL, Finals, Div. 2:http://codeforces.com/gym/100637 G. #TheDress[水] (st ...

  2. CF 2015 ICL, Finals, Div. 1 J. Ceizenpok’s formula [Lucas定理]

    http://codeforces.com/gym/100633/problem/J Lucas定理P不是质数裸题 #include <iostream> #include <cst ...

  3. codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula 扩展Lucas定理 扩展CRT

    默默敲了一个下午,终于过了, 题目传送门 扩展Lucas是什么,就是对于模数p,p不是质数,但是不大,如果是1e9这种大数,可能没办法, 对于1000000之内的数是可以轻松解决的. 题解传送门 代码 ...

  4. Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理

    http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...

  5. GYM100633J. Ceizenpok’s formula 扩展lucas模板

    J. Ceizenpok’s formula time limit per test 2.0 s memory limit per test 256 MB input standard input o ...

  6. codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula【扩展lucas】

    传送门 [题意]: 求C(n,k)%m,n<=108,k<=n,m<=106 [思路]: 扩展lucas定理+中国剩余定理    #include<cstdio> usi ...

  7. [Codeforces 100633J]Ceizenpok’s formula

    Description 题库链接 求 \[C_n^m \mod p\] \(1\leq m\leq n\leq 10^{18},2\leq p\leq 1000000\) Solution 一般的 \ ...

  8. codeforces Gym - 100633J Ceizenpok’s formula

    拓展Lucas #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...

  9. Codeforces.100633J.Ceizenpok's formula(扩展Lucas)

    题目链接 ->扩展Lucas //求C_n^k%m #include <cstdio> typedef long long LL; LL FP(LL x,LL k,LL p) { L ...

随机推荐

  1. python 单向链表实现

    单链表的操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 inse ...

  2. CPP链表示例

    #include<iostream> #include<stdlib.h> using namespace std; typedef struct Student_data { ...

  3. MySQL中使用sql语句获得表结构

    最近在研究PHP,那么就必须涉及到mysql.其中一个功能通过表数据自动生成页面,紧接着发现在一张空表中无法读取数据(因为人家刚刚新建,就是空的没有数据) 延伸出来便是直接查表结构获得字段名,再进行处 ...

  4. keycloak管理用户权限

    一.在keycloak中定义基础数据 1.realm 如果多个模块使用不同的用户权限,就分realm 如果多个模块共用一套用户权限,就顶一个一个realm 2.每个模块是一个client-app 3. ...

  5. restful架构风格设计准则(二)以资源为中心,一个url

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 1.REST是一种架构风格,其核心是面向资源,简化设计,降低开发的复杂性 ...

  6. sass的简介,安装,语法。

    一,sass的简介 1,Sass完全兼容所有版本的CSS.我们对此严格把控,所以你可以无缝地使用任何可用的CSS库. 2,Sass已经经过其核心团队超过8年的精心打造. 3,有无数的框架使用Sass构 ...

  7. python tornado TCPserver异步协程实例

    项目所用知识点 tornado socket tcpserver 协程 异步 tornado tcpserver源码抛析 在tornado的tcpserver文件中,实现了TCPServer这个类,他 ...

  8. 用Jmeter实现mysql数据库的增删查改

    主要是参考虫师的“使用JMeter创建数据库(Mysql)测试”. 1.打开Jmeter,点击测试计划 链接:https://pan.baidu.com/s/1ZtaZ6IC_0DRjSlXkjslY ...

  9. 复习HTML+CSS(5)

    n  <meta>标记 <meta>的主要作用,是提供网页的源信息.比如:指定网页的搜索关键字 <meta>标记有两个属性:http-equiv和name. 1. ...

  10. transform做2d和3d变形(css动画一)

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 有段时间我是没理清transform.translate.transition和animation之间的关 ...