题目就是求C(n,k)*H(n - k)%m

0<= k<= n <=10^9, 1 <= m <= 10^5, n != 0

其中H(n)是错排第n项。

对于C(n,k)%m可以参考我以前的文章

对于H(n)

直接套公式:

可以发现肯定在某一位会出现后面都是模完都是0

#include <cstdio>
#include <map>
using std::pair;
#define Pair pair<long long,long long>
const long long M = 100000 + 9;
long long fac[M],a[100],r[100];
struct triple{long long x,y,z;triple(const long long _x,const long long _y,const long long _z):x(_x),y(_y),z(_z){}};
triple exgcd(const long long a,const long long b)
{
if (!b) return triple(1,0,a);
triple last(exgcd(b,a%b));
return triple(last.y,last.x - a/b * last.y,last.z);
}
long long CRT(const long long (&a)[100],const long long (&r)[100],const long long cnt)
{
long long res = 0,MM = 1;
for (long long i = 1; i <= cnt; ++i) MM *= a[i];
for (long long i = 1; i <= cnt; ++i)
(res += exgcd(MM / a[i],a[i]).x % a[i] * r[i] % MM * (MM / a[i]) % MM) %= MM;
//printf("CRT %I64d\n",res + MM);
return (res + MM) % MM;
}
long long power(long long n,long long k,long long MOD)
{
n %= MOD;
long long res = 1;
for (; k; n = n * n % MOD,k /= 2)
if (k & 1) res = res * n % MOD;
return res;
}
long long H(const long long n,const long long MOD)
{
//H(n) = (3 * ... * n) - (4 * ... * n) + (5 * ... * n) + ... + (-1)^(n-1) * n + (-1)^n
if (n == 0) return 1 % MOD;
if (n == 1) return 0;
long long res = (n%2)?(-1):1;
for (long long i = n,t = res; i >= 3; --i) {
if (i % MOD == 0) break;
(t = - t * i) %= MOD;
(res += t) %= MOD;
}
//printf("TEST: %I64d\n",res + MOD);
return (res + MOD) % MOD;
}
Pair FnModP(long long n,const long long p,const long long MOD)
{
//Fn = n!
//fac[n] = n! % p
long long res = 1; long long c = 0;
while (n) {
(res *= power(fac[MOD],n / MOD,MOD)) %= MOD;
(res *= fac[n % MOD]) %= MOD;
n /= p;
c += n;
}
return std::make_pair(c,res);
}
void calc_fac(const long long p,const long long MOD)
{
fac[0] = 1;
for (long long i = 1; i <= MOD; ++i)
if (i % p) fac[i] = fac[i - 1] * i % MOD;
else fac[i] = fac[i - 1];
}
long long C(const long long n,const long long K,const long long p,const long long MOD)
{
//nCK % p^c
calc_fac(p,MOD);
Pair a(FnModP(n,p,MOD)),b(FnModP(K,p,MOD)),c(FnModP(n - K,p,MOD));
return 1ll * power(p,a.first - b.first - c.first,MOD) * a.second % MOD * ((exgcd(1ll * b.second * c.second % MOD,MOD).x % MOD + MOD) % MOD) % MOD;
}
long long work(long long n,long long K,long long MOD)
{
long long cnt = 0,c = 0;
const long long m = MOD;
for (long long i = 2; i * i <= MOD; ++i)
if (MOD % i == 0) {
a[++cnt] = 1;
for (c = 0; MOD % i == 0; MOD /= i) ++c,a[cnt] *= i;
r[cnt] = C(n,K,i,a[cnt]);
}
if (MOD > 1) r[++cnt] = C(n,K,MOD,MOD),a[cnt] = MOD;
//for (long long i = 1; i <= cnt; ++i) printf("%I64d %I64d\n",a[i],r[i]);
return 1ll * CRT(a,r,cnt) * H(n - K,m) % m;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("SEQN.in","r",stdin);
freopen("SEQN.out","w",stdout);
#endif
long long T,n,K,MOD;
scanf("%I64d",&T);
for (long long i = 1; i <= T; ++i) {
scanf("%I64d%I64d%I64d",&n,&K,&MOD);
printf("Case %I64d: %I64d\n",i,(work(n,K,MOD)%MOD + MOD)%MOD);
}
}

  

[SPOJ SEQN] [hdu3439]Sequence的更多相关文章

  1. 【spoj SEQN】【hdu 3439】Sequence

    题意: 给出n.m.k 求C(n,k)*H(n-k)%m的值 H(n-k)为错排公式 题解: 先算H(n-k) 计算H(n)有个通式: H(n)=(-1)^n+((-1)^(n-1))n+((-1)^ ...

  2. spoj 2319 BIGSEQ - Sequence

    You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need to fully partitio ...

  3. HDU3439 Sequence

    今天下午学习了二项式反演,做了一道错排的题,开始了苦逼的经历. 显然答案是C(︀n,k)︀*H(n − k).其中H(i)为长度为i的错排序列 然后经过课件上一番二项式反演的推导 我就写了个扩展卢卡斯 ...

  4. Bluetooth Baseband介绍

    目录 1. 概述 1.1 Clock(时钟) 1.2 寻址方式 2. 物理信道(Physical Channels) 3. 物理链路(Physical Links) 4. 逻辑传输层(Logical ...

  5. 蓝牙baseband概述

    从蓝牙specispecification中看,基带协议主要分为8个部分来介绍的,分别是概述.物理信道.物理连接.逻辑传输.逻辑连接.封包.比特流的处理.组网行为.这里面会涉及到很多的概念,主要是在概 ...

  6. 【专题】数位DP

    [资料] ★记忆化搜索:数位dp总结 之 从入门到模板 by wust_wenhao 论文:浅谈数位类统计问题 数位计数问题解法研究 [记忆化搜索] 数位:数字从低位到高位依次为0~len-1. 高位 ...

  7. 【SPOJ 2319】 BIGSEQ - Sequence (数位DP+高精度)

    BIGSEQ - Sequence You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need ...

  8. 【SPOJ】2319 BIGSEQ - Sequence

    [算法]数位DP [题解]动态规划 题目要求的是大整数……没办法只写了小数字的,感觉应该没错. 大题框架是最大值最小化的二分问题. 对于每一块要求count(b)-count(a-1)≥s 已知a如何 ...

  9. 【SPOJ】1182 Sorted bit sequence

    [算法]数位DP [题解]动态规划 写了预处理函数却忘了调用是一种怎样的体验? #include<cstdio> #include<cstring> #include<a ...

随机推荐

  1. 20155117王震宇 实验三 敏捷开发与XP实践 实验报告

    实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实 ...

  2. 查询timestamp类型数据

    $where=" roleid = 8 and lizhi = 0 and branchid IN (".implode(",",$ids).") a ...

  3. 2017ACM暑期多校联合训练 - Team 2 1008 HDU 6052 To my boyfriend (数学 模拟)

    题目链接 Problem Description Dear Liao I never forget the moment I met with you. You carefully asked me: ...

  4. 大聊PYthon----生成器

    再说迭代器与生成器之前,先说一说列表生成式 列表生成式 什么是列表生成式呢? 这个非常简单! 先看看普通青年版的! >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, ...

  5. Vue.js 在 webpack 脚手架中使用 cssnext

    Vue.js 的 webpack脚手架默认已经使用了 PostCSS 的 autoprefixer 的功能. 如果想使用下一代 css语法,即cssnext: 1. 安装依赖 npm install ...

  6. [003] largest_subarray_with_equal_1&0

    [Description] Given an array with only '1' and '0', find a largest length sub-array which contains e ...

  7. 76.ZYNQ-用PS控制DDR3内存读写

    本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧. 本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验 ...

  8. ldconfig是一个动态链接库管理命令

    ldconfig是一个动态链接库管理命令 为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig ldconfig  命令的用途,主要是在默认搜寻目录(/lib和/usr/li ...

  9. React 16 源码瞎几把解读 【二】 react组件的解析过程

    一.一个真正的react组件编译后长啥样? 我们瞎几把解读了react 虚拟dom对象是怎么生成的,生成了一个什么样的解构.一个react组件不光由若干个这些嵌套的虚拟dom对象组成,还包括各种生命周 ...

  10. 在Nginx服务器上屏蔽IP

    采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走. 本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现. 1.查找要屏蔽的 ...