Luogu-2480 古代猪文
我们首先来概括一下题意,其实就是给定 \(n,g\),求:
\]
如果 \(k\nmid n\),那么我们知道 \(\frac{n}{k}\cdot k=n\),所以原式转化为:
\]
根据欧拉定理原式转化为:
\]
由于 \(999911659\) 是一个质数,所以 \(\varphi(999911659)=999911658\)。原式可变为:
\]
很明显思路就是用 \(O(\sqrt{n})\) 的时间去找出 \(k\),然后快速求解组合数,很明显,Lucas 定理失效了,我们就需要进行一些问题的转化。我们可以对 \(999911658\) 进行质因数分解:\(999911658=2\times 3\times4679\times 35617\)。我们可以分别设:
\]
用中国剩余定理(CRT)解决即可。
注意特判 \(g=mod\)
//#pragma GCC optimize("Ofast","-funroll-loops","-fdelete-null-pointer-checks")
//#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read() {
char ch=getchar();
int f=1,x=0;
while(ch<'0'||ch>'9') {
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
const int mod=999911659,b[]={0,2,3,4679,35617};
int n,jc[50010],a[10],g,m[5];
int qpow(int x,int y) {
int ret=1;
while(y) {
if(y&1) {
ret*=x;
ret%=mod;
}
x=x*x%mod;
y>>=1;
}
return ret;
}
void exgcd(int a,int b,int &x,int &y) {
if(b==0) {
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
int x2=y;int y2=x-a/b*y;
x=x2;y=y2;
}
int gcd(int a,int b) {
return b==0? a:gcd(b,a%b);
}
int inv(int q,int p) {
int x,y;
int g=gcd(q,p);
q/=g;p/=g;
exgcd(q,p,x,y);
return (x+p)%p;
}
int calc(int n,int m,int p) {
if(m>n) {
return 0;
}
return jc[n]*inv(jc[m],p)%p*inv(jc[n-m],p)%p;
}
int c(int n,int m,int p) {
if(m==0) {
return 1;
}
return c(n/p,m/p,p)*calc(n%p,m%p,p)%p;
}
signed main() {
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read();g=read();
if(g==mod) {
cout<<0<<endl;
return 0;
}
int nn=sqrt(n);
for(int j=1;j<=4;j++) {
jc[0]=1;
for(int i=1;i<=b[4]+1;i++) {
jc[i]=jc[i-1]*i%b[j];
}
for(int i=1;i<=nn;i++) {
if(n%i==0) {
a[j]+=c(n,i,b[j]);
a[j]+=c(n,n/i,b[j]);
}
}
}
for(int i=1;i<=4;i++) {
m[i]=(mod-1)/b[i];
}
int ans=0;
for(int i=1;i<=4;i++) {
ans+=a[i]*m[i]%(mod-1)*inv(m[i],b[i])%(mod-1);
}
ans%=(mod-1);
cout<<qpow(g,ans)%mod<<endl;
//fclose(stdin);
//fclose(stdout);
return 0;
}
Luogu-2480 古代猪文的更多相关文章
- luogu 2480 古代猪文 数论合集(CRT+Lucas+qpow+逆元)
一句话题意:G 的 sigma d|n C(n d) 次幂 mod 999911659 (我好辣鸡呀还是不会mathjax) 分析: 1.利用欧拉定理简化模运算 ,将上方幂设为x,则x=原式mod ...
- luogu_2480: 古代猪文
洛谷:2480古代猪文 题意描述: 给定两个整数\(N,G\),求$G^{\sum_{k|n}C_n^k} mod 999911659 $. 数据范围: \(1\leq N\leq 10^9,1\le ...
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
- BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)
数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...
- BZOJ 1951: [Sdoi2010]古代猪文( 数论 )
显然答案是G^∑C(d,N)(d|N).O(N^0.5)枚举N的约数.取模的数999911659是质数, 考虑欧拉定理a^phi(p)=1(mod p)(a与p互质), 那么a^t mod p = a ...
- 1951: [Sdoi2010]古代猪文
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2171 Solved: 904[Submit][Status] ...
- BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2194 Solved: 919[Submit][Status] ...
- 古代猪文:数论大集合:欧拉定理,exgcd,china,逆元,Lucas定理应用
/* 古代猪文:Lucas定理+中国剩余定理 999911658=2*3*4679*35617 Lucas定理:(m,n)=(sp,tp)(r,q) %p 中国剩余定理:x=sum{si*Mi*ti} ...
- [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
[SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...
- BZOJ 1951 【SDOI2010】 古代猪文
题目链接:古代猪文 好久没写博客了,这次就先写一篇吧…… 题面好鬼……概括起来就是:给出\(N,G(\leqslant 10^9)\),求:\[G^{\sum_{d|n}\binom{n}{d}} \ ...
随机推荐
- [LeetCode]69. x 的平方根(数学,二分)
题目 https://leetcode-cn.com/problems/sqrtx 题解 方法一:牛顿迭代法 按点斜式求出直线方程(即过点Xn,f(Xn)),然后求出直线与x轴交点,即为Xn+1: 求 ...
- git远程仓库创建及代码提交
git仓库创建:1. mkdir project-repertory2. cd project-repertory3. git init --bare 此时,git仓库已成功创建. 本地要提交的代码在 ...
- Mybatis的几种传参方式,你了解吗?
持续原创输出,点击上方蓝字关注我 目录 前言 单个参数 多个参数 使用索引[不推荐] 使用@Param 使用Map POJO[推荐] List传参 数组传参 总结 前言 前几天恰好面试一个应届生,问了 ...
- CUMTCTF'2020 已做wp
三天的比赛终于结束了,不知道有没有睡10个小时,感觉像中了魔一样,但也很享受这种感觉,除了没有能和我一起琢磨题目朋友.. 就最终结果而言还是有一些可惜,明明号称擅长web和misc反而是得分比例最小的 ...
- 如何高雅的使用redis去获取一个值
//场景,给定一个订单号来从缓存中查询一个订单信息; 步骤: 1从redis中直接获取,有数据就返回 2.如果redis中没有值,就查数据库 3.数据库查到的数据不为空,就刷到redis中 4.返回查 ...
- Redis小记(三)
1.复制 通过slaveof命令或设置slaveof选项,实现一个服务器去复制另一个服务器,被复制的是主服务器,执行复制的是从服务器,复制过程中主从双方数据库保持数据一致 2.8版本以前,可分为初次复 ...
- Spring学习(七)--Spring的AOP
1.实现AOP的方式:通过proxy代理对象.拦截器字码翻译等. 2.AOP体系分层图,从高到低,从使用到实现: 基础:待增强或者目标对象 切面:对基础的增强应用 配置:把基础和切面结合起来,完成切面 ...
- ACMer不得不会的线段树,究竟是种怎样的数据结构?
大家好,欢迎阅读周三算法数据结构专题,今天我们来聊聊一个新的数据结构,叫做线段树. 线段树这个数据结构很多人可能会有点蒙,觉得没有听说过,但是它非常非常有名,尤其是在竞赛圈,可以说是竞赛圈的必备技能. ...
- java安全编码指南之:lock和同步的正确使用
目录 简介 使用private final object来作为lock对象 不要synchronize可被重用的对象 不要sync Object.getClass() 不要sync高级并发对象 不要使 ...
- ASP。NET Core Blazor CRUD使用实体框架和Web API
下载source code - 1.7 MB 介绍 *请查看我的Youtube视频链接来学习ASP.NET Core Blazor CRUD使用实体框架和Web API. 在本文中,我们将了解如何为A ...