我们首先来概括一下题意,其实就是给定 \(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. 原生js实现懒加载并节流

    像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费.采用懒加载技术,即用户浏览到哪儿,就加载该处的图片.这样节省网络资源.提升用户体验.减少服务器压力. 方法1: ...

  2. 分别用canvas和css3的transform做出钟表的效果

    两种方式实际上在js上的原理都是一样的.都是获取时间对象,再获取时间对象的时分秒,时分秒乘以其旋转一刻度(一秒.一分.一小时)对应的角度.css3中要赋值于transform:rotate(角度),c ...

  3. Mysql查看最大连接,修改

    1.查看最大连接量 show variables like '%max_connections%'; 2.修改最大连接量 //修改完记得重启 set GLOBAL max_connections = ...

  4. Java基础语法(10)-面向对象之三大特征

    title: Java基础语法(9)-面向对象之类的成员 blog: CSDN data: Java学习路线及视频 1.面向对象特征--封装 为什么需要封装?封装的作用和含义? 我要用洗衣机,只需要按 ...

  5. RFID了解

    转载自为什么大家都抛弃传统标签选择RFID电子标签? rfid电子标签是一种非接触式的自动识别技术,它通过射频信号来识别目标对象并获取相关数据,识别工作无需人工干预,作为条形码的无线版本,RFID技术 ...

  6. 中间件、蓝图、g对象

    中间件 ''' flask中一旦请求到来,要执行app()--->>>执行的是app.__call__,整个flask的入口 ''' from flask import Flask ...

  7. 【知识分享】Navicat Premium for Mac的破解教程

    转自Navicat Premium for Mac v12.0.22.0 破解教程,macOS上手动破解,无需补丁,无毒下载了Navicat,没有注册码,突然发现了这篇破解教程,竟爱不释手,顾Copy ...

  8. 苏大文正节点一 ORA-00603 ORA-27504 ORA-27300 ORA-27301 ORA-27302 BUG

      Problem Description --------------------------------------------------- Tue Sep 01 04:05:33 2020 s ...

  9. 深入理解SVM,详解SMO算法

    今天是机器学习专题第35篇文章,我们继续SVM模型的原理,今天我们来讲解的是SMO算法. 公式回顾 在之前的文章当中我们对硬间隔以及软间隔问题都进行了分析和公式推导,我们发现软间隔和硬间隔的形式非常接 ...

  10. python-字符串,字典,列表

    0x01 字符串 python单双引号都可以 str = "hello world" str_test = "yicunyiye" print(str,str_ ...