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. ord在python是什么意思?

    >>> help(ord)Help on built-in function ord in module builtins:ord(...) #这是一个函数 ord(c) -> ...

  2. Tornado 协程

    同步异步I/O客户端 from tornado.httpclient import HTTPClient,AsyncHTTPClient def ssync_visit(): http_client ...

  3. Hibernate之SQL查询

    Hibernate支持使用原生的SQL语句进行查询.使用原生的SQL的好处是:可以利用某些数据库的特性(不同的数据库SQL 语法会有所差异), 将原有的使用JDBC作为持久层技术的应用 ,迁移到使用H ...

  4. 关于kali linux 2.0的vmware tools的安装问题

    在安装好kali linux 2.0 后,首先要做的就是添加源并更新系统,否则会出现软件定位问题. 在kali 2.0中,vmware tools已经不能使用了,官方放了一个工具下载安装就好. 添加源 ...

  5. emqtt 试用(一)安装和测试

    一.安装 http://emqtt.io/docs/v2/getstarted.html http://emqtt.io/docs/v2/advanced.html http://emqtt.io/d ...

  6. docker实践

    我的docker 学习笔记2   ps axf docker run -d cyf:sshd /usr/sbin -D   docker  ps docker-enter.sh 686 ps axf ...

  7. apacheds的客户端

    Apache DS管理的JAVA实现 LdapConnection connection = new LdapNetworkConnection("localhost", 1038 ...

  8. window7下配置python2.7+tornado3.3开发环境

    发现之前写太繁琐..这里分享下同学的方法 1,安装 Python 2.7.x 版本地址:https://www.python.org/downloads/release/python-278/2,安装 ...

  9. JavaScript正则表达式学习笔记之一 - 理论基础

    自从年前得空写了两篇文章之后就开始忙了,这一忙就是2个月

  10. __init__特殊方法

    __init__特殊方法不应当返回除了none以外的任何方法.