「SDOI2010」 古代猪文 - Lucas定理+CRT

2024-01-02 07:49

本文主要是介绍「SDOI2010」 古代猪文 - Lucas定理+CRT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

Luogu2480

题意简述:给定 n , G n,G n,G,求
G ∑ d ∣ n C n d mod  999911659 G^{\sum\limits_{d|n}C_n^d}\text{mod}\ 999911659 GdnCndmod 999911659

分析

G mod  999911659 = 0 G\ \text{mod}\ 999911659=0 G mod 999911659=0,则答案为 0 0 0。否则,可以发现, 999911659 999911659 999911659是个质数,可以运用欧拉定理的推论:

g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1,则 a b ≡ a b mod  ϕ ( p ) ( mod  p ) a^b\equiv a^{b\ \text{mod}\ \phi(p)}(\text{mod}\ p) abab mod ϕ(p)(mod p)

将模数转移到指数上,变为求 ∑ d ∣ n C n d mod  999911658 \sum\limits_{d|n}C_n^d\ \text{mod}\ 999911658 dnCnd mod 999911658,然后用快速幂就得到答案了。
然后这东西看着可以用Lucas定理搞,但显然999911658不是质数,用扩展Lucas的方法,将其进行质因数分解,发现 999911658 = 2 ∗ 3 ∗ 4679 ∗ 35617 999911658=2*3*4679*35617 999911658=23467935617,于是可以用Lucas分别求 ∑ d ∣ n C n d \sum\limits_{d|n}C_n^d dnCnd模其质因数,设得到的结果为 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1,a2,a3,a4,然后再用中国剩余定理求解一下方程组:
{ x ≡ a 1 ( mod  2 ) x ≡ a 2 ( mod  3 ) x ≡ a 3 ( mod  4679 ) x ≡ a 4 ( mod  35617 ) \begin{cases} x\equiv a_1\ (\text{mod}\ 2)\\ x\equiv a_2\ (\text{mod}\ 3)\\ x\equiv a_3\ (\text{mod}\ 4679)\\ x\equiv a_4\ (\text{mod}\ 35617)\\ \end{cases} xa1 (mod 2)xa2 (mod 3)xa3 (mod 4679)xa4 (mod 35617)

设该方程组的最小正整数解为 x x x,则答案为 G x G^x Gx

附:欧拉定理推论的证明。
b = n ∗ ϕ ( p ) + r b=n*\phi(p)+r b=nϕ(p)+r,其中 0 ≤ r &lt; ϕ ( p ) 0\le r&lt;\phi(p) 0r<ϕ(p),则 r = b mod  ϕ ( p ) r=b\ \text{mod}\ \phi(p) r=b mod ϕ(p)。由于欧拉定理 a ϕ ( p ) ≡ 1 ( mod  p ) a^{\phi(p)}\equiv1\ (\text{mod}\ p) aϕ(p)1 (mod p),所以 a b ≡ a n ∗ ϕ ( p ) + r ≡ ( a ϕ ( p ) ) n ∗ a r ≡ a r ≡ a b mod  ϕ ( p ) ( mod  p ) a^b\equiv a^{n*\phi(p)+r}\equiv (a^{\phi(p)})^n*a^r\equiv a^r\equiv a^{b\ \text{mod}\ \phi(p)}\ (\text{mod}\ p) abanϕ(p)+r(aϕ(p))nararab mod ϕ(p) (mod p)

代码

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
const LL P=999911659;
const LL N=100005;
LL fac[N];
LL md[5]={4,2,3,4679,35617};
LL b[5],G,n;
LL ksm(LL x,LL y,LL p) {//快速幂 x%=p;LL res=1LL;for (;y;y>>=1,x=x*x%p)if (y&1) res=res*x%p;return res;
}
void initfac(LL n,LL p) {//阶乘预处理 fac[0]=1;for (int i=1;i<=n;i++)fac[i]=fac[i-1]*i%p;
}
LL C(LL n,LL m,LL p) {//计算C(n,m)if (m>n) return 0;return (fac[n]*ksm(fac[m],p-2,p))%p*ksm(fac[n-m],p-2,p);
}
LL Lucas(LL n,LL m,LL p) {//Lucas定理C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%pif (!m) return 1;return (Lucas(n/p,m/p,p)%p*C(n%p,m%p,p)%p)%p;
}
LL Exgcd(LL a,LL b,LL&x,LL&y) {//扩展欧几里得 if (!b) {x=1,y=0;return a;}LL d=Exgcd(b,a%b,x,y),t;t=x;x=y;y=t-(a/b)*y;return d;
}
LL CRT(LL *a,LL *m,LL n) {//中国剩余定理x==ai(mod mi)LL M=1,ans=0;for (int i=1;i<=n;i++) M*=m[i];for (int i=1;i<=n;i++) {LL x,y;Exgcd(M/m[i],m[i],x,y);x=(x%m[i]+m[i])%m[i];//求逆元 ans=(ans+a[i]*x%M*M/m[i])%M;}return (ans%M+M)%M;
}
LL Solve(LL n,LL p) {LL ans=0,m=sqrt(n);initfac(N-5,p);for (LL i=1;i<=m;i++)//枚举约数 if (n%i==0) {ans+=Lucas(n,i,p);if (i*i!=n) ans+=Lucas(n,n/i,p);//去除重复的一个 }return ans;
}
int main() {scanf("%lld%lld",&n,&G);if (G%P!=0) {for (int i=1;i<=4;i++)b[i]=Solve(n,md[i]);printf("%lld",ksm(G,CRT(b,md,4),P));} else printf("0");return 0;
}

这篇关于「SDOI2010」 古代猪文 - Lucas定理+CRT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561788

相关文章

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

CPC23三 K.(Lucas定理)

K.喵喵的神·数 Time Limit: 1 Sec Memory Limit: 128 MB Description 喵喵对组合数比较感兴趣,并且对计算组合数非常在行。同时为了追求有后宫的素质的生活,喵喵每天都要研究质数。 我们先来复习一下什么叫做组合数。对于正整数P、T 然后我们再来复习一下什么叫质数。质数就是素数,如果说正整数N的约数只有1和它本身,N

量化交易面试:什么是中心极限定理?

中心极限定理(Central Limit Theorem, CLT)是概率论和统计学中的一个重要定理,它描述了在一定条件下,独立随机变量的和的分布趋向于正态分布的性质。这个定理在量化交易和金融分析中具有重要的应用价值。以下是对中心极限定理的详细解释: 基本概念: 中心极限定理指出,当我们从一个具有任意分布的总体中抽取足够大的样本时,样本均值的分布将近似于正态分布,无论原始总体的分布是什么样的。

#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version

昨天编译文件时出现了Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~的错误。   在网上很容易找到了解决的方案,公布如下:   对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个MFC的使用,选择“在共享 DLL 中使

中国剩余定理和扩展中国剩余定理(模板)

给你一元线性同余方程组,如下: 其中,当  ,  , ... ,  两两互质的话就是中国剩余定理 , 不互质的话就是扩展中国剩余定理。 给出中国剩余定理的计算过程和扩展中国剩余定理的推理过程: #include<bits/stdc++.h>using namespace std;#define int long long#define endl '\n'#define

等式(数论/唯一分解定理)

链接: https://www.nowcoder.com/acm/contest/90/F 来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数) 输入描述: 在第一行输入一个正整数T。接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。(1<=n<=1e9) 输出描述: 输出符合该方程要求的解数。

数论 - 算数基本定理的运用 --- nefu 118 : n!后面有多少个0

题目链接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php   Mean:   略。 analyse:  刚开始想了半天都没想出来,数据这么大,难道是有什么公式? 首先我们要知道一点:n!里面所有的0都是2*5得来的,而且不管怎样2的数量一定是>5的数量,所以我们只需要考虑有多少个5就可。 后面也是看了解题报告才知道有

数论 --- 费马小定理 + 快速幂 HDU 4704 Sum

Sum  Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=4704   Mean:  给定一个大整数N,求1到N中每个数的因式分解个数的总和。   analyse: N可达10^100000,只能用数学方法来做。 首先想到的是找规律。通过枚举小数据来找规律,发现其实answer=pow(2,n-1);

HDU 1573X问题(扩展中国剩余定理)

Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10)。 Input 输入数据的第一行为一个正整数T,表示有T组测试数据。每组测试数据的第一行为两个正整数N,M (0 <