今天下午学习了二项式反演,做了一道错排的题,开始了苦逼的经历。

显然答案是C(︀n,k)︀*H(n − k).
其中H(i)为长度为i的错排序列

然后经过课件上一番二项式反演的推导

我就写了个扩展卢卡斯然后交上去了。

一直t啊.....

我算了算复杂度差不多是O(T*P*log^3P)

后来剪了剪枝,应该低了点。

还是t啊.....

我搜了搜题解发现没有我这么写的。

看了一下错排是有规律的,果然还是打表大法吼啊。

发个正解

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qmod(ll n,ll m,ll p)
{
ll ans=;
while(m)
{
if(m&)ans=ans*n%p;
n=n*n%p;m>>=;
}
return ans;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){
x=;y=;return;
}
exgcd(b,a%b,y,x);y-=a/b*x;
}
ll inv(ll n,ll p)
{
if(!n)return ;
ll a=n,b=p,x=,y=;
exgcd(a,b,x,y);
x=(x%b+b)%b;
if(!x)x+=b;
return x;
}
ll mul(ll n,ll pi,ll pk)
{
if(!n)return 1ll;
ll ans=;
if(n/pk)
{
for(ll i=;i<=pk;++i)
if(i%pi)ans=ans*i%pk;
ans=qmod(ans,n/pk,pk)%pk;
}
for(ll i=;i<=n%pk;++i)
if(i%pi)ans=ans*i%pk;
return ans*mul(n/pi,pi,pk)%pk;
}
int C(ll n,ll m,ll p,ll pi,ll pk)
{
if(m>n)return ;
ll a=mul(n,pi,pk),b=mul(m,pi,pk),c=mul(n-m,pi,pk);
ll k=,ans;
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*inv(b,pk)%pk*inv(c,pk)%pk*qmod(pi,k,pk)%pk;
return ans*(p/pk)%p*inv(p/pk,pk)%p;//CRT
}
bool v[];
int pp[],cnt;
void pri()
{
for(int i=;i<=;++i)
{
if(!v[i])
{
pp[++cnt]=i;
}
for(int j=;j<=cnt&&i*pp[j]<=;++j)
{
v[i*pp[j]]=;
if(i%pp[j]==)break;
}
}
}
ll calc(ll n,ll m,ll p)
{
ll ans=;
for(ll x=p,i=;i<=cnt&&x;++i)
{
if(x==)break;
if(x%pp[i]==)
{
ll num=;
while(x%pp[i]==)x/=pp[i],num*=pp[i];
ans=(ans+C(n,m,p,pp[i],num))%p;
}
}
return ans;
}
ll F(ll x,ll p)
{
ll ans=;
if(x==)return ;
x=x%(*p);
if(x==)x=*p;
for(int i=;i<=x;++i)
ans=(ans*i+(i%==?:-))%p;
return (ans+p)%p;
}
int main()
{
ll n,m,p,t,ans=;
scanf("%I64d",&t);pri();v[]=;
for(int ii=;ii<=t;++ii)
{
scanf("%I64d%I64d%I64d",&n,&m,&p);
ans=calc(n,m,p)%p;
ans=ans*F(n-m,p)%p;
printf("Case %d: %I64d\n",ii,ans);
}
return ;
}

再补个我的辣鸡程序,路过的dalao帮忙看看也中啊、

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qmod(ll n,ll m,ll p)
{
ll ans=;
while(m)
{
if(m&)ans=ans*n%p;
n=n*n%p;m>>=;
}
return ans;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){
x=;y=;return;
}
exgcd(b,a%b,y,x);y-=a/b*x;
}
ll inv(ll n,ll p)
{
if(!n)return ;
ll a=n,b=p,x=,y=;
exgcd(a,b,x,y);
x=(x%b+b)%b;
if(!x)x+=b;
return x;
}
ll mul(ll n,ll pi,ll pk)
{
if(!n)return 1ll;
ll ans=;
if(n/pk)
{
for(ll i=;i<=pk;++i)
if(i%pi)ans=ans*i%pk;
ans=qmod(ans,n/pk,pk)%pk;
}
for(ll i=;i<=n%pk;++i)
if(i%pi)ans=ans*i%pk;
return ans*mul(n/pi,pi,pk)%pk;
}
int C(ll n,ll m,ll p,ll pi,ll pk)
{
if(m>n)return ;
ll a=mul(n,pi,pk),b=mul(m,pi,pk),c=mul(n-m,pi,pk);
ll k=,ans;
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*inv(b,pk)%pk*inv(c,pk)%pk*qmod(pi,k,pk)%pk;
return ans*(p/pk)%p*inv(p/pk,pk)%p;//CRT
}
bool v[];
int pp[],cnt;
void pri()
{
for(int i=;i<=;++i)
{
if(!v[i])
{
pp[++cnt]=i;
}
for(int j=;j<=cnt&&i*pp[j]<=;++j)
{
v[i*pp[j]]=;
if(i%pp[j]==)break;
}
}
}
ll calc(ll n,ll m,ll p)
{
ll ans=;
for(ll x=p,i=;i<=cnt&&x;++i)
{
if(x==)break;
if(x%pp[i]==)
{
ll num=;
while(x%pp[i]==)x/=pp[i],num*=pp[i];
ans=(ans+C(n,m,p,pp[i],num))%p;
}
}
return ans;
}
int main()
{
ll n,m,p,t,ans=;
scanf("%I64d",&t);pri();v[]=;
for(int ii=;ii<=t;++ii)
{
scanf("%I64d%I64d%I64d",&n,&m,&p);
ans=calc(n,m,p)%p;n-=m;ll pre=;ll num=,pos=max(0ll,n-p);
if(!ans)
{
printf("Case %d: %I64d\n",ii,pre*ans%p);continue;
}
for(ll k=n;k>=pos;--k)
{
if(n!=k)num=num*(n-k)%p;
if(k&1ll)pre=(pre-calc(n,k,p)%p*num%p+p)%p;
else pre=(pre+calc(n,k,p)%p*num%p)%p;
if(!num)break;
}
printf("Case %d: %I64d\n",ii,pre*ans%p);
}
return ;
}

好吧,蒟蒻苦逼的一下午。

同时纪念衡水人民224起义。

HDU3439 Sequence的更多相关文章

  1. [SPOJ SEQN] [hdu3439]Sequence

    题目就是求C(n,k)*H(n - k)%m 0<= k<= n <=10^9, 1 <= m <= 10^5, n != 0 其中H(n)是错排第n项. 对于C(n,k ...

  2. oracle SEQUENCE 创建, 修改,删除

    oracle创建序列化: CREATE SEQUENCE seq_itv_collection            INCREMENT BY 1  -- 每次加几个              STA ...

  3. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

  4. DG gap sequence修复一例

    环境:Oracle 11.2.0.4 DG 故障现象: 客户在备库告警日志中发现GAP sequence提示信息: Mon Nov 21 09:53:29 2016 Media Recovery Wa ...

  5. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  6. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  7. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  8. [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...

  9. [LeetCode] Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

随机推荐

  1. 什么是HTTP协议

    什么是Http协议Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) .它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎 ...

  2. BSGS 算法

    求解 A^x ≡ B mod C  C是质数 的最小非负整数解 证明:A^x ≡ A^(x%φ(C)) mod C A^(x%φ(C))  ≡ A^(x-k*φ(C)) ≡ (A^x)/ A^(k*φ ...

  3. 何凯文每日一句打卡||DAY13

  4. Unable to Distribute in Xcode5?

    Blog Unable to Distribute in Xcode5? I have the  question, if this screenshot is what you getting. ( ...

  5. size属性

    size 属性 size 属性规定输入字段的尺寸(以字符计): <form action=""> First name:<br> <input typ ...

  6. python 入门基础22 --复习 面向对象

    面向过程编程思想: 核心:过程 过程指的是解决问题的具体步骤,即先干什么再干什么. 基于该编程思想编写程序,相当于一条流水线,一种机械式的思维方式. 面向对象编程思想: 核心:对象 对象指的是数据与方 ...

  7. deeplearning.ai学习RNN

    一.RNN基本结构 普通神经网络不能处理时间序列的信息,只能割裂的单个处理,同时普通神经网络如果用来处理文本信息的话,参数数目将是非常庞大,因为如果采用one-hot表示词的话,维度非常大. RNN可 ...

  8. innobackupex不停库的数据备份并恢复到别的服务器上【转】

    1.innobackupex原理: 备份原理 1).首先会开启一个后台检测进程,实时检测myql redo的变化,一旦发现redo中有新日志写入,立即将日志记入后台日志文件xtrabackup_log ...

  9. 启动DELPHI2010出现 EditorLineEnds.ttr 错误的解决方法

      在网上找到了很多方法.其实解决这个问题的方法, 最简单的就是把  EditorLineEnds.ttr  改名为  EditorLineEnds.ttf 然后,安装它, 安装完成后就OK了.

  10. HNOI2019滚粗记

    HNOI2019滚粗记 标签: 游记 Day -1 在学校打摆被抓. Day 0 在家打摆. Day 1 来长沙理工大学打摆 开场看完题之后,感觉T3不太可做,然后T1T2又显得特别套路,然后把T2 ...