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

显然答案是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. 鸟哥的Linux私房菜——第十一章

    视频链接: 土豆:http://www.tudou.com/programs/view/yT0PfIWU720 B站(推荐): http://www.bilibili.com/video/av9877 ...

  2. matplotlib交互模式与pacharm单独Figure设置

    matplotlib交互模式与pacharm单独Figure设置 觉得有用的话,欢迎一起讨论相互学习~Follow Me Matpotlib交互模式 在运行python程序时有时候需要生成以下的 动态 ...

  3. bzoj千题计划255:bzoj3572: [Hnoi2014]世界树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3572 明显需要构造虚树 点属于谁管理分三种情况: 1.属于虚树的点 2.在虚树上的边上的点 3.既不 ...

  4. C++ map & set

    山东第六届ACM省赛B题 超时代码: #include<iostream> #include<cstdio> #include<string.h> #include ...

  5. [R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。

    解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独 ...

  6. python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__

    __getattr__:     属性查找失败后,解释器会调用 __getattr__ 方法. class TmpTest: def __init__(self): self.tmp = 'tmp12 ...

  7. 04 uni-app框架学习:禁用顶部原生导航栏

    1.在pages.json中配置 比如要首页禁用 就在首页这个选项里 加上这几句代码 2.效果如下

  8. Debian安装Nvidia最简单方法

    电脑配置: Dell本本 i7+gtx1050+8g 安装bumblebee: sudo apt install bumblebee-nvidia primus 以上会自动安装nvidia驱动. bu ...

  9. LTE:eMBMS架构

    一个MBSFN区域是由一个或多个传输相同内容的小区组成的特殊区域.如图1所示,小区8和9都属于MBSFN区域C.一个MBSFN区域可由多个小区组成,一个小区也可以属于多个(至多8个,从36.331中的 ...

  10. mac 安装gevent报错

    运行pip install gevent报错 错误信息如下 xcrun: error: invalid active developer path (/Library/Developer/Comman ...