2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)
2 seconds
256 megabytes
standard input
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.
Single line contains three integers n, k, m, separated with spaces (1 ≤ n ≤ 1018, 0 ≤ k ≤ n, 2 ≤ m ≤ 1 000 000).
Write the formula value for given arguments n, k, m.
2 1 3
2
4 2 5
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定理)的更多相关文章
- 2015 ICL, Finals, Div. 2【ABFGJK】
[题外话:我......不补了......] 2015 ICL, Finals, Div. 2:http://codeforces.com/gym/100637 G. #TheDress[水] (st ...
- CF 2015 ICL, Finals, Div. 1 J. Ceizenpok’s formula [Lucas定理]
http://codeforces.com/gym/100633/problem/J Lucas定理P不是质数裸题 #include <iostream> #include <cst ...
- codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula 扩展Lucas定理 扩展CRT
默默敲了一个下午,终于过了, 题目传送门 扩展Lucas是什么,就是对于模数p,p不是质数,但是不大,如果是1e9这种大数,可能没办法, 对于1000000之内的数是可以轻松解决的. 题解传送门 代码 ...
- Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理
http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...
- 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 ...
- codeforces2015ICL,Finals,Div.1#J Ceizenpok’s formula【扩展lucas】
传送门 [题意]: 求C(n,k)%m,n<=108,k<=n,m<=106 [思路]: 扩展lucas定理+中国剩余定理 #include<cstdio> usi ...
- [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 一般的 \ ...
- codeforces Gym - 100633J Ceizenpok’s formula
拓展Lucas #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...
- 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 ...
随机推荐
- Linux学习--线程控制
关于线程控制,主要就是几个模块,我们一个一个消灭.消化: 一.线程创建: 1.先来看看在Linux环境下的线程创建函数: 分析:意思很明显: 1.函数名是 pthread_create : 2.功能 ...
- Beta冲刺Day4
项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...
- php的调试工具xdebug
zend_extension = "D:/developsoftware/wamp/bin/php/php5.5.12/zend_ext/php_xdebug-2.2.5-5.5-vc11- ...
- vue-入门
数据绑定 <!--步骤1:创建html文件--> <!DOCTYPE html> <html lang="en"> <head> ...
- WPF 自定义RadioButton样式
一.RadioButton基本样式 RadioButton基本样式包含两种状态,这里也是使用两张图片来代替两种状态,当然你也可以通过IconFont或Path来替换这两种状态. 效果如下: 样式代码如 ...
- servlet filter中使用autowired无法注入
问题: 我们为了避免未经授权的人直接通过url访问我们的页面,配置了如下filter <!-- 登录过滤器 --> <filter> <filter-name>se ...
- *args和**kwargs
#coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 ...
- Java:逐行读、写文件、文件目录过滤的用法
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...
- 对return函数的认识
例1: def funOut(): def funIn(): print('宾果!你成功访问到我啦!') return funIn() #注意这里return的是funIn()即是一个函数 funOu ...
- python判断素数的方法
#运用python的数学函数 import math def isPrime(n): if n <= 1: return False for i in range(2, int(math.sqr ...