LGP2155题解
lg最优解来写题解啦(
题目大意:
多测:
\]
根据 \(\gcd\) 的结论,我们可以得到答案其实是:
\]
恩,然后我们就可以直接做了
预处理 \(n!\) 及其逆元,以及 \(\varphi(n!)\)。
那么怎么得到 \(\varphi(n!)\) 呢?考虑从 \(\varphi((n-1)!)\) 递推过来。
注意到 \(n!\) 有一个性质,就是其为所有不大于 \(n\) 的质数的倍数。也就是说 \(\varphi(n!)\) 可以写成:
\]
其中所有的 \(k\) 一定都不小于 \(1\)。
分类讨论一下:
- 当 \(n\) 为质数时,\(\varphi(n!)=\varphi((n-1)!) \times (n-1)\)
- 当 \(n\) 不为质数时,\(\varphi(n!)=\varphi((n-1)!) \times n\)
于是可以递推得到 \(\varphi(n!)\)。
那么对于前面的那个分数,都知道当 \(n \geq mod\) 并且 \(m \geq mod\) 时是不能直接算的,因为 \(n!\) 中的 \(mod\) 和 \(m!\) 中的 \(mod\) 有可能会抵消掉。
于是在递推阶乘的时候可以特判一下,当 \(i=mod\) 时直接令 \(n!=(n-1)!\)。
在计算的时候再判断一下 \(\lfloor \frac n {mod} \rfloor\) 是否等于 \(\lfloor \frac m {mod} \rfloor\) 就可以避免这个问题了。
复杂度为 \(O(n+T)\)。
code:
#include<cstdio>
typedef __uint128_t L;
typedef unsigned long long ull;
const int M=1e7+5;
int T,P,mx,top,n[10005],m[10005],pri[M],phi[M],fac[M],ifac[M];bool zhi[M];
struct FastMod{
ull b,m;
FastMod(ull b):b(b),m(ull((L(1)<<64)/b)){}
friend inline ull operator%(const ull&a,const FastMod&mod){
ull q=(L(mod.m)*a)>>64;
ull r=a-q*mod.b;
return r>=mod.b?r-mod.b:r;
}
}mod(2);
signed main(){
register int i,j,x;
scanf("%d%d",&T,&P);phi[1]=fac[1]=ifac[1]=1;mod=FastMod(ull(P));
for(i=1;i<=T;++i)scanf("%d%d",n+i,m+i),mx=n[i]>mx?n[i]:mx,mx=m[i]>mx?m[i]:mx;
for(i=2;i<=mx;++i){
if(!zhi[i])pri[++top]=i,phi[i]=1;
for(j=1;j<=top&&(x=i*pri[j])<=M;++j){
zhi[x]=true;if(!(i%pri[j]))break;
}
phi[i]=i-phi[i];
}
for(i=2;i<=mx;++i){
if(i^P)fac[i]=1ull*fac[i-1]*i%mod,ifac[i]=1ull*(P-P/i)*ifac[P%i]%mod;
else fac[i]=fac[i-1],ifac[i]=1;
}
for(i=2;i<=mx;++i)phi[i]=1ull*phi[i-1]*phi[i]%mod,ifac[i]=1ull*ifac[i-1]*ifac[i]%mod;
for(i=1;i<=T;++i)printf("%d\n",n[i]-n[i]%P==m[i]-m[i]%P?1ull*fac[n[i]]*ifac[m[i]]%mod*phi[m[i]]%mod:0);
}
LGP2155题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- element ui图片上传方法
<!--商品图片--> <template v-slot:product_cover> <el-upload list-type="picture-card&q ...
- autorelease基本使用
1.autorelease基本概念 autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里 ...
- Java8 Stream 的一些操作和介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11858186.html Java8 Stream 是一个新的东西, 就是能够将常见的数据结构转 ...
- 如何使PreparedStatement支持命名参数
http://m.blog.csdn.net/wallimn/article/details/3734242
- MySQL 数据库SQL语句——高阶版本2
MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...
- 数据库监测sql执行
SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...
- 基于redis5的redis cluster部署
一.环境规划 #准备六台主机,地址如下 10.0.0.8 ---> master1 10.0.0.18 ---> master2 10.0.0.28 ---> master3 10. ...
- Ultra Math Preview : VSCode上的LaTeX公式实时预览插件
一直觉着 VS Code 的 TeX 公式(包括 markdown 和 LaTeX)只能在定界符上hover预览,或者开一个预览面板看,没有那种像 Typora 一样紧跟在公式后面的预览面板,多少有些 ...
- Tomcat是什么?
Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器. 为什么我们需要用到Tomcat 如果你学过html,css,你会知道你写的 ...
- Vue-从入门到第三次世界大战_1
前言:当然世界大战是大家都不希望看到的这里是代表我会一直更新下去 ,那我为什么要这么写,没错我就是标题党. 先说下Vue介绍: 官网:https://cn.vuejs.org/ 为什么用:因为是TMD ...