P2480 [SDOI2010]古代猪文

比较综合的一题

前置:Lucas 定理crt

求的是:

\[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbinom{n}{d}
\]

由于这个\(999911659\)是质数,肯定于\(g\)互质,所以由欧拉定理很容易证明:

\[a^{\varphi(p)}\equiv 1\pmod p\Rightarrow a^{k\bmod \varphi(p)}\equiv a^k\pmod p
\]

那么可以得出:

\[g^x\bmod 999911659\equiv g^{x\bmod \varphi(999911659)}\pmod {999911659}
\]

\[g^x\bmod 999911659\equiv g^{x\bmod 999911658}\pmod {999911659}
\]

所以问题转换为求:

\[\sum_{d\mid n}\tbinom{n}{d}\bmod 999911658
\]

这种大组合数的问题考虑用 Lucas,但是模数太大,且不是质数

所以考虑将它分解:\(999911658=2\times 3\times 4679\times 35617\)

那么,只需要对每一个质因数,求出\(a\equiv \sum_{d\mid n}\tbinom{n}{d}\bmod p_i\),然后再用 crt 合并就行了

算的时候,枚举每一个\(i\le \sqrt n\),如果\(i\mid n\),则计算\(\tbinom{n}{i}\)和\(\tbinom{n}{\frac{n}{i}}\)加到答案里

但是,在这种因数不能重复计算的时候,要:

for(reg int i=1;i*i<=n;i++)

而不是

for(reg int i=1;i<=std::ceil(std::sqrt(n));i++)

对于后一种,举个栗子:\(\lceil\sqrt {420}\rceil=21\),但是如果\(i\)一直枚举到\(21\),就会在\(i=20,i=21\)的时候算两次\(20,21\)这两个因数,重复了,出现错误

还有,因为每次的计算模数不同,所以要分别预处理

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
register int x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
const int prime[4]={2,3,4679,35617};
int fac[40006],inv[40005];
inline int power(int a,int b,int p){
int ret=1;
while(b){
if(b&1) ret=1ll*ret*a%p;
b>>=1;a=1ll*a*a%p;
}
return ret;
}
inline void pre(int n,int mod){
fac[0]=inv[0]=1;
for(reg int i=1;i<n;i++) fac[i]=(LL)fac[i-1]*i%mod;
inv[n-1]=power(fac[n-1],mod-2,mod);
for(reg int i=n-2;i;i--) inv[i]=(LL)inv[i+1]*(i+1)%mod;
}
inline int get_C(int n,int m,int mod){
//C(n,m)=n!/(m!*(n-m)!)
if(n<m) return 0;
return ((LL)fac[n]*inv[m]%mod)*inv[n-m]%mod;
}
inline int lucas(int n,int m,int mod){
if(n<m) return 0;
if(!n||!m) return 1;
return (LL)lucas(n/mod,m/mod,mod)*get_C(n%mod,m%mod,mod)%mod;
}
int main(){
// std::freopen("out.txt","w",stdout);
const int M=999911658;
int n=read(),g=read();
g%=(M+1);
if(!g) return std::puts("0"),0;
reg int ans=0,Mi,t;
for(reg int o=0;o<4;o++){
pre(prime[o],prime[o]);
reg int nowans=0;
for(reg int i=1;i*i<=n;i++)if(!(n%i)){
nowans=(nowans+lucas(n,i,prime[o]))%prime[o];
if(i*i!=n) nowans=((LL)nowans+lucas(n,n/i,prime[o]))%prime[o];
}
// std::printf("now ans = %d\n",nowans);
// for(reg int i=0;i<prime[o];i++) std::printf("%d %d\n",fac[i],inv[i]);
Mi=M/prime[o];
t=power(Mi,prime[o]-2,prime[o]);//t=Mi^{-1} mod prime[o]
ans=(ans+((LL)nowans*Mi%M*t%M))%M;
}
std::printf("%d",power(g,ans,M+1));
return 0;
}

P2480 [SDOI2010]古代猪文的更多相关文章

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

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

  2. 洛谷 P2480 [SDOI2010]古代猪文 解题报告

    P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...

  3. 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理

    P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...

  4. 洛谷 P2480 [SDOI2010]古代猪文 题解【欧拉定理】【CRT】【Lucas定理】

    数论综合题. 题目背景 题目背景与题目无关因此省略.题目链接 题目描述 猪王国的文明源远流长,博大精深. iPig 在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为 \(N\).当然,一种语 ...

  5. P2480 [SDOI2010]古代猪文 Lucas+CRT合并

    \(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...

  6. 洛谷P2480 [SDOI2010]古代猪文

    要求(图是盗来的QAQ) 首先用欧拉定理把幂模一下,直接就是MOD-1了 然后发现MOD-1可以分解为2,3,4679,35617,都是质数,可以直接用Lucas定理 然后用中国剩余定理合并一下即可 ...

  7. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  8. luogu P2480 [SDOI2010]古代猪文

    M_sea:这道题你分析完后就是一堆板子 废话 理解完题意后,我们要求的东西是\(G^s(s=\sum_{d|n} \binom{n}{d})\) 但是这个指数\(s\)算出来非常大,,, 我们可以利 ...

  9. Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT

    好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...

随机推荐

  1. ESLint如何配置

    1.简介 通过用 ESLint 来检查一些规则,我们可以: 统一代码风格规则,如:代码缩进用几个空格:是否用驼峰命名法来命名变量和函数名等. 减少错误, 如:相等比较必须用 === ,变量在使用前必须 ...

  2. 7.5 this关键字的使用;标准学生类的编写 、构造方法的格式

    /** 学生类** 起名字我们要求做到见名知意.* 而我们现在的代码中的n和a就没有做到见名知意,所以我要改进.** 如果有局部变量名和成员变量名相同,在局部使用的时候,采用的是就近的原则. * 我们 ...

  3. 几行代码实现cookie的盗取

    前言 上一篇文章中介绍了XSS(跨站脚本攻击)简单原理与几种类型.接下来通过实例用几行代码实现cookie的盗取. 正文 这里测试用的工具是DVWA(可以本地搭建,前面文章有介绍),和phpstudy ...

  4. tf.nn.softmax 分类

    tf.nn.softmax(logits,axis=None,name=None,dim=None) 参数: logits:一个非空的Tensor.必须是下列类型之一:half, float32,fl ...

  5. 2020年iOS进阶面试题总结(一)

    准备找工作的你,可以看看,复习复习!! 1.说一下OC的反射机制 在动态运行下我们可以构建任何一个类,然后我们通过这个类知道这个类的所有的属性和方法,并且如果我们创建一个对象,我们也可以通过对象找到这 ...

  6. Mac Jenkins+fastlane 简单几步实现iOS自动化打包发布 + jenkins节点设置

    最近在使用jenkins 实现ios自动化打包发布蒲公英过程实践遇到了一些坑,特意记录下来方便有需要的人. 进入正题: 一.安装Jenkins 1.Mac上安装Jenkins 遇到到坑 因为 Jenk ...

  7. 【python实现卷积神经网络】Flatten层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  8. 使用Scanner接受用户键盘输入的值

    第一步导入Scanner import java.util.*; 第二步创建Scanner对象 Scanner input = new Scanner(System.in); 第二步创建Scanner ...

  9. 利用opencv实现视频捕捉功能

    import cv2 as cv import numpy as np def video_demo(): capture = cv.VideoCapture(0) #打开摄像头,参数0代表设备ID( ...

  10. 如何使用python在短时间内寻找完数

    完数:完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数.它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.如果一个数恰好等于它的因子之和,则称该数 ...