我们首先来概括一下题意,其实就是给定 \(n,g\),求:

\[g^{\sum_{k\nmid n} C_n^{\frac{n}{k}}}\operatorname{mod} 999911659
\]

如果 \(k\nmid n\),那么我们知道 \(\frac{n}{k}\cdot k=n\),所以原式转化为:

\[g^{\sum_{k\nmid n} C_n^k}\operatorname{mod} 999911659
\]

根据欧拉定理原式转化为:

\[g^{(\sum_{k\nmid n} C_n^k)\operatorname{mod} \varphi(999911659)}\operatorname{mod} 999911659
\]

由于 \(999911659\) 是一个质数,所以 \(\varphi(999911659)=999911658\)。原式可变为:

\[g^{(\sum_{k\nmid n} C_n^k)\operatorname{mod} 999911658}\operatorname{mod} 999911659
\]

很明显思路就是用 \(O(\sqrt{n})\) 的时间去找出 \(k\),然后快速求解组合数,很明显,Lucas 定理失效了,我们就需要进行一些问题的转化。我们可以对 \(999911658\) 进行质因数分解:\(999911658=2\times 3\times4679\times 35617\)。我们可以分别设:

\[\begin{cases}a_1={(\sum_{k\nmid n} C_n^k)\operatorname{mod} 2}\\a_2={(\sum_{k\nmid n} C_n^k)\operatorname{mod} 3}\\a_3={(\sum_{k\nmid n} C_n^k)\operatorname{mod} 4679}\\a_4={(\sum_{k\nmid n} C_n^k)\operatorname{mod} 35617}\end{cases}
\]

用中国剩余定理(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 古代猪文的更多相关文章

  1. luogu 2480 古代猪文 数论合集(CRT+Lucas+qpow+逆元)

    一句话题意:G 的 sigma d|n  C(n d) 次幂  mod 999911659 (我好辣鸡呀还是不会mathjax) 分析: 1.利用欧拉定理简化模运算 ,将上方幂设为x,则x=原式mod ...

  2. luogu_2480: 古代猪文

    洛谷:2480古代猪文 题意描述: 给定两个整数\(N,G\),求$G^{\sum_{k|n}C_n^k} mod 999911659 $. 数据范围: \(1\leq N\leq 10^9,1\le ...

  3. 洛咕 P2480 [SDOI2010]古代猪文

    洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...

  4. BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)

    数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...

  5. 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 ...

  6. 1951: [Sdoi2010]古代猪文

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2171  Solved: 904[Submit][Status] ...

  7. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2194  Solved: 919[Submit][Status] ...

  8. 古代猪文:数论大集合:欧拉定理,exgcd,china,逆元,Lucas定理应用

    /* 古代猪文:Lucas定理+中国剩余定理 999911658=2*3*4679*35617 Lucas定理:(m,n)=(sp,tp)(r,q) %p 中国剩余定理:x=sum{si*Mi*ti} ...

  9. [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)

    [SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...

  10. BZOJ 1951 【SDOI2010】 古代猪文

    题目链接:古代猪文 好久没写博客了,这次就先写一篇吧…… 题面好鬼……概括起来就是:给出\(N,G(\leqslant 10^9)\),求:\[G^{\sum_{d|n}\binom{n}{d}} \ ...

随机推荐

  1. vue2.5开发去哪儿了流程

    初始化项目 在 src/assets 中添加样式初始化文件 reset.css ; border.css 本地引入取消延迟300毫秒的控件 cnpm i fastclick -S 在mian.js中引 ...

  2. mysql之慢日志查询

    转自https://my.oschina.net/wuweixiang/blog/2987434 首先得配置my.cnf: #===================================== ...

  3. Raspberry Pi 4B 安装 CentOS 8

    最近新入手一块Raspberry Pi 4B 8G的板子,想在这块板子上搭建CentOS 8的环境.经过数次采坑终于安装成功. 准备条件: 1.Raspberry Pi 4B 板子 +  SD卡 2. ...

  4. 【JAVA】HashMap源码阅读

    目录 1.关键的几个static参数 2.内部类定义Node节点 3.成员变量 4.静态方法 5.HashMap的四个构造方法 6.put方法 7.扩容resize方法 8.get方法 9.remov ...

  5. synchronized和lock的作用与对比

    一.synchronized的作用 synchronized是java中的一个关键字,用于线程同步.1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象 ...

  6. 《InnoDB存储引擎》笔记

    第1章 Mysql体系结构和存储引擎 1.1 定义数据库和实例 数据库:database,物理的操作系统文件或其他形式文件类型的集合.当使用NDB存储引擎时,数据库文件可能是存放在内存中而不是磁盘之上 ...

  7. python中浅拷贝和深拷贝的区别

    浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...

  8. 微服务实战系列(七)-网关springcloud gateway

    1. 场景描述 springcloud刚推出的时候用的是netflix全家桶,路由用的zuul,但是据说zull1.0在大数据量访问的时候存在较大性能问题,2.0就没集成到springcloud中了, ...

  9. Python-装饰器中保留被装饰函数元数据

     函数的元数据包括哪些呢? 1. 函数名 .__name__ 2. 函数注释 .__doc__ ... 那,如何保留被装饰函数元数据,通过wraps装饰器保留被装饰函数的元数据 import time ...

  10. DOS批处理中%cd%与%~dp0的区别详解

    转载:https://www.jb51.net/article/105325.htm DOS批处理中%cd%与%~dp0的区别详解     Windows下批处理中%cd%和%~dp0都能用来表示当前 ...