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 ...
随机推荐
- mysql 不同引擎的比较
mysql 支持的默认引擎是InnoDB,其他的常用引擎包括MyISAM等,那么他们有什么差别呢. 首先执行 show engines; 来查看数据库当前支持的引擎. 可以看到mysql支持这么多不同 ...
- 说说Cookie和Session
Session和Cookie在网站开发中是用来保存用户与后端服务器的交互状态.它们有各自的缺点和优点.而且,他们的优点和应用场景是对立的. Cookie 完整地描述:当一个用户通过HTTP访问一个 ...
- python---django中form组件(数据添加前使用自定义方法<django预留扩展点3个>进行验证,以及源码分析)
form组件代码: from app02.models import Userfrom django.core.exceptions import ValidationError class Ajax ...
- JS面向对象编程之对象(简化版)
上次网上看了一篇这个文章,然后乱七八糟晕头转向把我晕的够呛.看了半天没找到错的地方但是浏览器Hello world就是没有定义...我也是醉了,最后发现我认为是废话的话一句话竟然有用!!!所以我还是简 ...
- 一组数字,从1到n,从中减少了3个数,顺序打乱,放在n-3的数组里,找出丢失数字
曾经看到有这样一个JS题:有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里请找出丢失的数字,最好能有程序,最好算法比较快假设n=10000 下面我也来贴一个算法. func ...
- VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二)
准备工作 相关浏览: VMware Linux 下 Nginx 安装配置 (一) 1. 选在 /usr/local/ 下创建 softs 文件夹,通过 ftp 命令 把 apache-tomcat-7 ...
- 20155328 2016-2017-2 《Java程序设计》第六周 学习总结
20155328 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 根据不同的分类标准,IO可分为:输入/输出流:字节/字符流:节点/处理流. 在不使用Inpu ...
- snmp 简单的网络管理协议
snmp snmptranslate . # 查看映射关系 DISMAN-EVENT-MIB::sysUpTimeInstance snmpdf -v -c public localhost # SN ...
- Jenkins mac pkg安装 后默认配置文件/启动路径
自启动文件路径 /Library/LaunchDaemons/org.jenkins-ci.plist jenkins.war 执行文件路径 /Applications/Jenkins/jenkins ...
- HDU 2680 Choose the best route 最短路问题
题目描述:Kiki想去他的一个朋友家,他的朋友家包括所有的公交站点一共有n 个,一共有m条线路,线路都是单向的,然后Kiki可以在他附近的几个公交站乘车,求最短的路径长度是多少. 解题报告:这道题的特 ...