[武汉集训] Cliquers
题意
设把\(n\)个不同元素分成若干个大小相等的集合的方案个数为\(res\),求\(m^{res}\)模\(10^9-401\)后的余数。 (n,m不超过2*10^9)
分析
可以知道,所求答案为\(m^r \bmod P\)其中\(r=\sum_{d\mid n} \dfrac{n!}{\frac{n}{m}!^dd!} \bmod (P-1)\)。
考场时的想法:我们可以写暴力!预处理阶乘,把阶乘中与\(P-1\)相关的因子单独搞
代码实现
#include <bits/stdc++.h>
#pragma GCC optimize("2")
#define LL long long
using namespace std;
const int N=1e7+10;
const int P=1e9-401;
const int P1=2,P2=13,P3=5281,P4=7283; //P-1=P1*P2*P3*P4
struct node {
int p,a1,a2,a3,a4;
} f[N];
inline int fpow(int x,int y) {
register int c=1;
for(; y; y>>=1,x=1LL*x*x%(P-1))
if(y&1) c=1LL*c*x%(P-1);
return c;
}
inline void exgcd(int a,int b,int&x,int&y,int&d) {
if(!b) d=a,x=1,y=0;
else exgcd(b,a%b,y,x,d),y-=a/b*x;
}
inline int inv(int c) {
static int x,y,d;
exgcd(c,P-1,x,y,d);
assert(d==1);
y=(P-1)/d;
x=(x%y+y)%y;
return x;
}
inline int get(int n,int d) {
return 1LL*f[n].p
*inv(1LL*fpow(f[n/d].p,d)*f[d].p%(P-1))%(P-1)
*fpow(P1,f[n].a1-d*(f[n/d].a1)-f[d].a1)%(P-1)
*fpow(P2,f[n].a2-d*(f[n/d].a2)-f[d].a2)%(P-1)
*fpow(P3,f[n].a3-d*(f[n/d].a3)-f[d].a3)%(P-1)
*fpow(P4,f[n].a4-d*(f[n/d].a4)-f[d].a4)%(P-1);
}
inline int ind(int n) {
int c=0;
for(int d=1; d<=n/d; ++d) {
if(n%d!=0) continue;
c=(c+get(n,d))%(P-1);
if(n/d!=d) c=(c+get(n,n/d))%(P-1);
}
return c;
}
int main() {
freopen("c://users/hsy/desktop/cliquers/cliquers3.in","r",stdin);
// freopen("c://users/hsy/desktop/cliquers.out","w",stdout);
f[0].p=1;
for(int i=1; i<N; ++i) {
f[i]=f[i-1];
long long x=i;
while(x%P1==0) x/=P1,f[i].a1++;
while(x%P2==0) x/=P2,f[i].a2++;
while(x%P3==0) x/=P3,f[i].a3++;
while(x%P4==0) x/=P4,f[i].a4++;
f[i].p=x*f[i].p%(P-1);
}
int T,n,m,ans;
scanf("%d",&T);
while(T--) {
ans=1; scanf("%d%d",&n,&m);
for(int x=m,y=ind(n); y; y>>=1,x=1LL*x*x%P)
if(y&1) ans=1LL*ans*x%P;
printf("%d\n",ans);
}
return 0;
}
然后联想到扩展卢卡斯,(其实是考完后听到某AK大牛谈到的),刚好适用于处理阶乘间的运算处理,于是改改就是道模板题了。
代码实现
#include <bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
using namespace std;
struct ex_lucas {
void gcd(LL a,LL b,LL&x,LL&y) {
if(b==0) x=1, y=0;
else gcd(b,a%b,y,x),y-=a/b*x;
}
LL inv(LL a,LL b) {
static LL x,y;
gcd(a,b,x,y);
return (x%b+b)%b;
}
LL pow(LL a,LL b,LL p) {
LL c=1;
for(; b; b>>=1,a=a*a%p)
if(b&1) c=c*a%p;
return c;
}
LL fac(LL n,LL pi,LL pm) {
if(n==0) return 1;
LL c=1;
for(LL i=2; i<=pm; ++i)
if(i%pi) c=c*i%pm;
c=pow(c,n/pm,pm);
for(LL i=2; i<=n%pm; ++i)
if(i%pi) c=c*i%pm;
return c*fac(n/pi,pi,pm)%pm;
}
LL par(LL n,LL m,LL p,LL pi,LL pm) {
LL a=fac(n,pi,pm);
LL b=inv(fac(m,pi,pm),pm);
LL c=inv(pow(fac(n/m,pi,pm),m,pm),pm);
LL k=0, d=0;
for(LL i=n; i;) k+=(i/=pi);
for(LL i=m; i;) k-=(i/=pi);
for(LL i=n/m; i;) k-=(i/=pi)*m;
d=a*b%pm*c%pm*pow(pi,k,pm)%pm;
return d*(p/pm)%p*inv(p/pm,pm)%p;
}
LL ind(LL n,LL m,LL p) { //可以再简化。。毕竟P-1固定。。
LL c=0, x=p, pm;
for(LL i=2; x!=1 && i*i<=p; ++i) {
if(x%i==0) {
for(pm=1; x%i==0;) pm*=i, x/=i;
c=(c+par(n,m,p,i,pm))%p;
}
}
if(x>1) c=(c+par(n,m,p,x,x))%p;
return c;
}
} System;
const int P=1e9-401;
int main() {
// freopen("c://users/hsy/desktop/cliquers/cliquers.in","r",stdin);
// freopen("c://users/hsy/desktop/cliquers.out","w",stdout);
int T,n,m;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&m);
int x=m,y=0,ans=1;
for(int d=1; d<=n/d; ++d) {
if(n%d!=0) continue;
y=(y+System.ind(n,d,P-1))%(P-1);
if(d!=n/d) y=(y+System.ind(n,n/d,P-1))%(P-1);
}
for(; y; y>>=1,x=1LL*x*x%P)
if(y&1) ans=1LL*ans*x%P;
printf("%d\n",ans);
}
return 0;
}
后记
考场上分解质因数出锅了,只搞到了前3个质数,然后愉快爆0。(草,中日双语)
[武汉集训] Cliquers的更多相关文章
- ACM zb的生日
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- zb的生日
http://acm.nyist.net/JudgeOnline/problem.php?pid=325 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 ...
- nyoj325 zb的生日(DFS)
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- nyoj 325 zb的生日
01背包 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄 ...
- 分西瓜(DFS)
描述今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb ...
- zb的生日(暴搜dfs)
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- nyoj 325 zb的生日(dfs)
描述今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb ...
- nyoj 0325 zb的生日(dp)
nyoj 0325 zb的生日 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集 ...
- nyoj zb的生日
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝 ...
随机推荐
- 深度解析Java内存原型
一.Java 虚拟机内存原型 寄存器:我们在程序中无法控制. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中. 堆:存放用new产生的数据. 静态域:存放在对象中用stat ...
- 大数据学习之HDFS基本API操作(下)06
hdfs文件流操作方法一: package it.dawn.HDFSPra; import java.io.BufferedReader; import java.io.FileInputStream ...
- Exp1 PC平台逆向破解 20165235 祁瑛
Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...
- 谷歌浏览器F12基本用法
第一步:打开你想进行调试的页面,并按F12进入到调试模式 此处以百度页面为例进行功能展示 这是关于最右侧“元素选择器”的功能展示 关于第二个功能的使用,这个功能是将页面适应成手机屏幕大小, eleme ...
- docker报错Service 'pwn_deploy_chroot' failed to build: Get https://registry-1.docker.io/v2/library/ubuntu/manifests/16.04:net/http: request canceled
这几天碰到师傅让我帮忙做pwn题环境,结果遇到了坑 第一种方法是:https://blog.csdn.net/zhaoyayua/article/details/60141660 解决办法是执行 vi ...
- 使用selenium操作ant design前端的页面,感觉页面没加载完
因需要收集页面数据,遂准备使用selenium爬取瓦斯阅读页面, 瓦斯网站使用的是ant design,元素定位非常困难,页面元素都没有ID,现在还只是能做到操作登录,不能自动打开订阅,查询某公众号, ...
- Windows远程桌面相关
3389端口是Windows系统远程终端服务以及系统远程桌面服务默认所使用的端口,原本是为了管理人员能够方便的远程维护管理计算机而设计的,但如今已经成为了黑客们最喜爱的一种人侵途径,入侵者通过3389 ...
- Bootstrap 常用属性
一,关于按钮 btn系列 二.关于div 移动位置 col 系列 col-md 系列 col-lg系列 这些都是让多个div在当前页面等大小 三.居中系列 1.文本居中 text-center 2.图 ...
- Spring Security 整合freemaker 实现简单登录和角色控制
Spring Security 整合freemaker 实现简单登录和角色控制 写这篇文章是因为我做了一个电商网站项目,近期刚加上权限控制.整个过程很简单,在此给大家梳理一下,也算是自己对知识 ...
- 18 ArcGIS API for JavaScript4.X 系列加载天地图(经纬度)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...