HDU3439 Sequence
今天下午学习了二项式反演,做了一道错排的题,开始了苦逼的经历。
显然答案是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的更多相关文章
- [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 ...
- oracle SEQUENCE 创建, 修改,删除
oracle创建序列化: CREATE SEQUENCE seq_itv_collection INCREMENT BY 1 -- 每次加几个 STA ...
- Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等
功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...
- DG gap sequence修复一例
环境:Oracle 11.2.0.4 DG 故障现象: 客户在备库告警日志中发现GAP sequence提示信息: Mon Nov 21 09:53:29 2016 Media Recovery Wa ...
- Permutation Sequence
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- [LeetCode] Sequence Reconstruction 序列重建
Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
- [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 ...
- [LeetCode] Longest Consecutive Sequence 求最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
随机推荐
- 什么是HTTP协议
什么是Http协议Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) .它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎 ...
- 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*φ ...
- 何凯文每日一句打卡||DAY13
- Unable to Distribute in Xcode5?
Blog Unable to Distribute in Xcode5? I have the question, if this screenshot is what you getting. ( ...
- size属性
size 属性 size 属性规定输入字段的尺寸(以字符计): <form action=""> First name:<br> <input typ ...
- python 入门基础22 --复习 面向对象
面向过程编程思想: 核心:过程 过程指的是解决问题的具体步骤,即先干什么再干什么. 基于该编程思想编写程序,相当于一条流水线,一种机械式的思维方式. 面向对象编程思想: 核心:对象 对象指的是数据与方 ...
- deeplearning.ai学习RNN
一.RNN基本结构 普通神经网络不能处理时间序列的信息,只能割裂的单个处理,同时普通神经网络如果用来处理文本信息的话,参数数目将是非常庞大,因为如果采用one-hot表示词的话,维度非常大. RNN可 ...
- innobackupex不停库的数据备份并恢复到别的服务器上【转】
1.innobackupex原理: 备份原理 1).首先会开启一个后台检测进程,实时检测myql redo的变化,一旦发现redo中有新日志写入,立即将日志记入后台日志文件xtrabackup_log ...
- 启动DELPHI2010出现 EditorLineEnds.ttr 错误的解决方法
在网上找到了很多方法.其实解决这个问题的方法, 最简单的就是把 EditorLineEnds.ttr 改名为 EditorLineEnds.ttf 然后,安装它, 安装完成后就OK了.
- HNOI2019滚粗记
HNOI2019滚粗记 标签: 游记 Day -1 在学校打摆被抓. Day 0 在家打摆. Day 1 来长沙理工大学打摆 开场看完题之后,感觉T3不太可做,然后T1T2又显得特别套路,然后把T2 ...