P2480 [SDOI2010]古代猪文
求的是:
\]
由于这个\(999911659\)是质数,肯定于\(g\)互质,所以由欧拉定理很容易证明:
\]
那么可以得出:
\]
\]
所以问题转换为求:
\]
这种大组合数的问题考虑用 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]古代猪文的更多相关文章
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
- 洛谷 P2480 [SDOI2010]古代猪文 解题报告
P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...
- 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理
P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...
- 洛谷 P2480 [SDOI2010]古代猪文 题解【欧拉定理】【CRT】【Lucas定理】
数论综合题. 题目背景 题目背景与题目无关因此省略.题目链接 题目描述 猪王国的文明源远流长,博大精深. iPig 在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为 \(N\).当然,一种语 ...
- P2480 [SDOI2010]古代猪文 Lucas+CRT合并
\(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...
- 洛谷P2480 [SDOI2010]古代猪文
要求(图是盗来的QAQ) 首先用欧拉定理把幂模一下,直接就是MOD-1了 然后发现MOD-1可以分解为2,3,4679,35617,都是质数,可以直接用Lucas定理 然后用中国剩余定理合并一下即可 ...
- 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)
洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...
- luogu P2480 [SDOI2010]古代猪文
M_sea:这道题你分析完后就是一堆板子 废话 理解完题意后,我们要求的东西是\(G^s(s=\sum_{d|n} \binom{n}{d})\) 但是这个指数\(s\)算出来非常大,,, 我们可以利 ...
- Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT
好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...
随机推荐
- mybatis源码分析--如何加载配置及初始化
简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...
- 9.1 ArrayList(集合)的使用,与array(数组)的对比
1.array 和ArrayList的区别? array 数组的长度是固定的,适应不了变化的需求. ArrayList集合的长度可变.大小可变. 2.为什么要用集合,它优点是什么? java是面向对象 ...
- 武汉加油!(Python版)
#武汉加油!import turtle as tt.pensize(20)t.pencolor("blue")t.setup(1700, 600) t.penup()#-t.got ...
- spark下载安装,运行examples(spark一)
1.官方网址 http://spark.apache.org/ image.png 2.点击下载 下载最新版本目前是(2.4.3)此spark预设为hadoop2.7或者更高版本,我前面安装的是had ...
- Java中都通用文件下载(ContentType、文件头、response、out四步骤)
Java中都通用文件下载(ContentType.文件头.response.out四步骤) 新浪微博:IT国子监(记得关注噢) http://weibo.com/itguozijian 我们就直接 ...
- 【python实现卷积神经网络】批量归一化层实现
代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...
- 使用SVG内置API计算图形或点经过transform之后的新坐标
一个应用场景是,点击一条路径,显示该路径的控制点.因为有transform变形( 平移.缩放.倾斜.旋转等变换),所以获取变形后的新坐标需要计算. 纯数学的方法,就是用2D变换矩阵的一些公式去运算,过 ...
- 化繁为简,弱监督目标定位领域的新SOTA - 伪监督目标定位方法(PSOL) | CVPR 2020
论文提出伪监督目标定位方法(PSOL)来解决目前弱监督目标定位方法的问题,该方法将定位与分类分开成两个独立的网络,然后在训练集上使用Deep descriptor transformation(DDT ...
- 数字电路技术之触发器(基本RS触发器)
一.触发器的知识 1.触发器是构成时序逻辑电路的基本逻辑部件. 2.[1]它有两个稳定的状态:0状态和1状态: [2]在不同的输入情况下,它可以被置成0状态或1状态: [3]当输入 ...
- vue2.x学习笔记(十五)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12609450.html. 组件的自定义事件 这里来学习一下组件中的自定义事件. 事件名 不同于组件名和prop,事 ...