??? cliquers
解:先推一个式子,然后就是CRT了...
那个阶乘怎么求呢?主要是分母可能有0,这时我们把分母的因子p全部提出来,上下次数相减判断即可。
细节颇多......注意在快速幂开始的时候a %= MO是个好习惯。
#include <cstdio>
#include <algorithm> typedef long long LL;
const int N = ;
const LL MO = 1e9 - , mod[] = {, , , , }; int turn;
LL ans[], n, m, nn[][];
//LL inv[10000][5], invn[10000][5]; inline LL qpow(LL a, LL b, LL c) {
LL ans = ;
a %= c;
while(b) {
if(b & ) ans = ans * a % c;
a = a * a % c;
b = b >> ;
}
return ans;
} inline LL Pow(LL a, LL b) {
LL ans = ;
while(b) {
if(b & ) ans = ans * a;
a = a * a;
b = b >> ;
}
return ans;
} LL exgcd(LL a, LL &x, LL b, LL &y) {
if(!b) {
x = ; y = ;
return a;
}
LL g = exgcd(b, x, a % b, y);
std::swap(x, y);
y -= x * (a / b);
return g;
} inline LL getnn(LL x) {
if(!x) return ;
LL t = x / mod[turn];
LL ans = qpow(nn[mod[turn] - ][turn], t, mod[turn]);
t = x % mod[turn];
return ans * nn[t][turn] % mod[turn] * getnn(x / mod[turn]);
} inline LL cal(LL k) { //printf("cal %lld \n", k);
//bool f = (turn == 2 && k == 2) || (turn == 2 && k == 1); LL time = ;
for(LL i = n; i > ; i /= mod[turn]) {
time += i / mod[turn];
//printf("1 time += %lld = %lld \n", i / mod[turn], time);
}
for(LL i = k; i > ; i /= mod[turn]) {
time -= i / mod[turn];
//printf("2 time -= %lld = %lld \n", i / mod[turn], time);
}
for(LL i = n / k; i > ; i /= mod[turn]) {
time -= (i / mod[turn]) * k;
//printf("3 time -= %lld = %lld\n", i / mod[turn], time);
}
if(time) {
//printf(" -- -- return 0 \n");
//printf("mod = %lld ans = 0\n", mod[turn]);
return ;
} LL t1 = getnn(n), t2 = getnn(k), t3 = getnn(n / k);
/*if(f) {
printf("%lld %lld %lld \n", t1, t2, t3);
}*/
t3 = qpow(t3, k, mod[turn]);
t2 = qpow(t2, mod[turn] - , mod[turn]);
t3 = qpow(t3, mod[turn] - , mod[turn]); //printf("return %lld \n", t1 * t2 % mod[turn] * t3 % mod[turn]);
//printf("mod = %lld k = %lld ans = %lld \n", mod[turn], k, t1 * t2 % mod[turn] * t3 % mod[turn]);
return t1 * t2 % mod[turn] * t3 % mod[turn];
} inline LL solve() { /// cal each prime
LL ans = ;
for(LL i = ; i * i <= n; i++) {
if(n % i) continue;
ans = (ans + cal(i)) % mod[turn];
if(i * i < n) {
ans = (ans + cal(n / i)) % mod[turn];
}
}
return ans;
} inline void work() {
scanf("%lld%lld", &n, &m);
//m %= MO; for(turn = ; turn <= ; turn++) {
ans[turn] = solve();
//printf("ans %d %lld = %lld \n", turn, mod[turn], ans[turn]);
} /// excrt
/*LL a = ans[1], p = mod[1];
for(int i = 2; i <= 4; i++) {
/// merge
//printf("merge %d \n", i);
LL P = p * mod[i], x, y;
LL c1 = ((a - ans[i]) % P + P) % P;
//printf("a = %lld c1 = %lld \n", a, c1);
LL g = exgcd(mod[i], x, p, y);
(x *= (c1 / g)) %= P; (y *= (c1 / g)) %= P;
a = (x * mod[i] % P + ans[i]) % P;
p = P;
//printf("merge %lld ans = %lld \n", mod[i], a);
}*/
/// crt
LL a = , p = MO - ;
for(int i = ; i <= ; i++) {
a = (a + ans[i] * (p / mod[i]) % p * qpow(p / mod[i], mod[i] - , mod[i]) % p) % p;
} //printf("over \n");
a = (a % p + p) % p;
//printf("a = %lld\n", a);
LL ans = qpow(m, a, MO);
printf("%lld\n", ans);
return;
} inline void prework() {
for(turn = ; turn <= ; turn++) {
//invn[0][turn] = inv[0][turn]turn] = nn[0][turn] = 1;
nn[][turn] = ;
//invn[1][turn] = inv[1][turn]turn] = nn[1][turn] = 1;
for(int i = ; i < mod[turn]; i++) {
nn[i][turn] = nn[i - ][turn] * i % mod[turn];
//inv[i][turn] = inv[mod[turn] % i] * (mod[turn] - mod[turn] / i) % mod[turn];
//invn[i][turn] = invn[i - 1][turn] * inv[i][turn] % mod[turn];
}
}
return;
} int main() { freopen("cliquers.in", "r", stdin);
freopen("cliquers.out", "w", stdout); prework(); int T;
scanf("%d", &T);
while(T--) {
work();
}
return ;
}
AC代码
两种CRT都写了。
??? cliquers的更多相关文章
- [武汉集训] Cliquers
题意 设把\(n\)个不同元素分成若干个大小相等的集合的方案个数为\(res\),求\(m^{res}\)模\(10^9-401\)后的余数. (n,m不超过2*10^9) 分析 可以知道,所求答案为 ...
- BZOJ3501 : PA2008 Cliquers Strike Back
\[\begin{eqnarray*}ans&=&m^{\sum_{i=1}^n Stirling2(n,i)\bmod 999999598}\bmod 999999599\\& ...
- BZOJ3500 : PA2008 Cliquers
设g[i]表示n=i时的答案,则OEIS上可以找到如下递推式: g[i]=g[i-1]+g[i-2]-g[i-5]-g[i-7]+... 其中符号为++--交替,第i项为f[i],f[1]=1,f[2 ...
- bzoj 3501 PA2008 Cliquers Strike Back——贝尔数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角形 p^2 地预处理 p 以内的贝尔数.可以模(mod-1)(它是每个分解下 ...
- bzoj 3501 PA2008 Cliquers Strike Back —— 贝尔数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角预处理贝尔数,拆模数并在 \( p \) 进制下使用公式,因为这样每次角标增 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- React.js 入门与实战课程思维导图
原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,在这里分享了课程中的思维导图,供大家参考. 原文发表于我的技术博客 此导图为课程 ...
- Nginx负载均衡中后端节点服务器健康检查的操作梳理
正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样 ...
- Command Analyze failed with a nonzero exit code
在运行RN项目的时候,报 Command Analyze failed with a nonzero exit code ,试着将build System 修改下
- Linux内核分析——第十八章 调试
第十八章 调试 18.1 准备开始 1.在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2.内核级开发的调试工作远比用户级开发艰难的多. 3.准备工作需要的是: (1)一个bug (2 ...
- 关于对springboot程序配置文件使用jasypt开源工具自定义加密
一.前言 在工作中遇到需要把配置文件加密的要求,很容易就在网上找到了开源插件 jasypt (https://github.com/ulisesbocchio/jasypt-spring-boot# ...
- logstash 解析日志文件
input { file { path => "/usr/local/test/log.log" } } filter { grok { match => { &quo ...
- app推广及主要代码
app推广: 一.基本情况 我们把推广和调研都放在了一起,主要是调研,主要通过调查问卷和直接访问的方式,让调查的人能够看到我们app的主要功能, 然后做出评价和对此改善的意见.调 ...
- Kitematic - VirtualBox is not installed. Docker for windows 10
Kitematic - VirtualBox is not installed. Docker for windows 10 https://github.com/docker/kitematic/i ...
- Comparison of Static Code Analysis Tools for Java
http://www.sw-engineering-candies.com/blog-1/comparison-of-findbugs-pmd-and-checkstyle https://stack ...
- Oracle Gateways 方式创建dblink 连接 SQLSERVER数据库
1. 安装多次 发现在同一个机器上面总出问题,所以建议找一个没有安装oracle的机器上面进行安装gateways 2. 下载oracle gateways 并且解压缩, 下载地址详情见官网. 下载的 ...