首页 > 其他分享 >【题解】古代猪文

【题解】古代猪文

时间:2022-10-15 21:26:10浏览次数:83  
标签:return int 题解 古代 llt res 猪文 lmod mod

\(\textrm{luogu P2480 [SDOI2010]古代猪文}\)

所以说嘛,我现在才刚入数论的门。

简要题意:

求 \(\large g^{\sum_{d \mid n}\binom{n}{d}}\) 在模 \(999911659\) 意义下的值。(以下简记为 \(mod\))

  1. 欧拉定理

检测到 \(mod\) 为素数,于是有 \(\gcd(g,mod) = 1\),可以考虑使用欧拉定理。

欧拉定理

\[\gcd(a,n) = 1 \implies a^n \equiv a^{n \bmod {\varphi(n)}} \pmod n \]

由于 \(mod\) 为素数,故 \(\varphi(mod) = mod-1\)。

于是原题等价于求解 \(g^{\sum_{d \mid n}\binom{n}{d} \bmod {mod-1}} \bmod mod\)。

  1. 卢卡斯定理

现在发现求 \(\binom{n}{d}\) 时肯定不能直接 \(\mathcal{O}(n)\) 求,不然就爆了。

尝试卢卡斯定理

\[p \in prime \implies \binom{n}{m} \equiv \binom{\left\lfloor n/p \right\rfloor}{\left\lfloor m/p \right\rfloor} \times \binom{n \bmod p}{m \bmod p} \pmod p \]

  1. 中国剩余定理

发现 \(mod-1 = 999911658\) 有点大了不是?何况也不是质数,总不能打一份扩展卢卡斯罢。

尝试唯一分解:\(999911658 = 2 \times 3 \times 4679 \times 35617\)。

所以我们先求出 \(\sum_{d \mid n}\binom{n}{d}\) 在模 \(2,3,4679,35617\) 意义下的值 \(a_i,a_2,a_3,a_4\)。

最后用中国剩余定理

合并成其在模 \(999911658\) 意义下的值。


对了,记得防爆 long long

#include <iostream>
typedef long long llt;
const llt mod = 999911659;
const int lmod[4] = {2,3,4679,35617};
llt quick_multi(llt _a,llt n,llt p) {
	llt _res = 0ll;
	while(n) {
		if(n&1) {
			_res += _a;
			if(_res >= p) 
				_res -= p;
		}
		_a <<= 1;
		if(_a >= p) 
			_a -= p;
		n >>= 1;
	}
	return _res;
}
int quick_pow(int _a,int n,int p) {
	int _res = 1;
	while(n) {
		if(n&1) 
			_res = 1ll*_res*_a%p;
		_a = 1ll*_a*_a%p;
		n >>= 1;
	}
	return _res;
}
llt defend_pow(llt _a,llt n,llt p) {
	llt _res = 1ll;
	while(n) {
		if(n&1) 
			_res = quick_multi(_res,_a,p);
		_a = quick_multi(_a,_a,p);
		n >>= 1;
	}
	return _res;
}
int fact[35620], inv[35620];
int a[4];
void init(int p) {
	fact[0] = inv[0] = 1;
	for(int i = 1;i < p;++i) 
		fact[i] = 1ll*fact[i-1]*i%p;
	inv[p-1] = quick_pow(fact[p-1],p-2,p);
	for(int i = p-2;i >= 1;--i) 
		inv[i] = 1ll*inv[i+1]*(i+1)%p;
}
int C(int n,int m,int p) {
	if(n < m||n < 0||m < 0) 
		return 0;
	return 1ll*fact[n]*inv[m]%p*inv[n-m]%p;
}
int Lucas(int n,int m,int p) {
	if(n < m) 
		return 0;
	if(!n) 
		return 1;
	return 1ll*Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
llt ans;
void CRT() {
	for(int i = 0;i < 4;++i) 
		ans = (ans+a[i]*((mod-1)/lmod[i])%(mod-1)*quick_pow(mod/lmod[i],lmod[i]-2,lmod[i]))%(mod-1);
}
int n, g;
int main() {
	scanf("%d %d",&n,&g);
	if(!(g%mod)) {
		printf("0\n");
		return 0;
	}
	for(int i = 0;i < 4;++i) {
		init(lmod[i]);
		int d = 1;
		for(;d*d < n;++d) 
			if(!(n%d)) {
				a[i] += Lucas(n,d,lmod[i])+Lucas(n,n/d,lmod[i]);
				while(a[i] >= lmod[i]) 
					a[i] -= lmod[i];
			}
		if(d*d == n) {
			a[i] += Lucas(n,d,lmod[i]);
			if(a[i] >= lmod[i]) 
				a[i] -= lmod[i];
		}
	}
	CRT();
	printf("%lld\n",defend_pow(g,ans,mod));
	return 0;
}

标签:return,int,题解,古代,llt,res,猪文,lmod,mod
From: https://www.cnblogs.com/bikuhiku/p/SDOI2010-gudaizhuwen-sol.html

相关文章

  • MAC MYSQL问题解决方案
    目录下载安装添加环境变量下载安装添加环境变量zsh:commandnotfound:mysql说明环境变量没有添加上方案一:cd~vim~/.bashrc//打开的文档中加入下面这句话alia......
  • 「题解」Codeforces 441E Valera and Number
    感觉是dp好题啊!这里令\(n\)作为原题面中的\(k\).方法一:我认为的通过常规思路想出来的做法。正常思路是设\(f_{i,x}\)表示操作了\(i\)步得到\(x\)的概率。但是......
  • 「题解」Codeforces 1442E Black, White and Grey Tree
    怎么题解都是清一色的dp啊我们需要做的是,从简单的情景出发,找到性质。不难想到的是,相邻的同色节点可以合并到一起,因为如果无论何种最优操作,总是可以将这个同色连通块里......
  • 洛谷 P8268 [USACO22OPEN] Alchemy B 题解
    Part0题意简述原题给出拥有的金属数量与金属配方,求金属\(N\)最大能合成的数量。Part1题目分析首先,金属\(i\)能配出的最大数量只和它的原数量和它的配方中能合......
  • RST-900500: Service invoked failed: null问题解决
      在做登录跳转时,发现页面没有跳转,并且有报错信息(Uncaught(inpromise)未知错误!Promise.then(async))。一、问题描述服务端返回500报错:能正常发出请求:二、分析......
  • 算法第四版习题解答(1.1 Basic Programming Model)
    前言使用的是《算法》第四版英文版,主要是习题解答。书中jar包的导入请戳:算法(第四版)中algs4.jar下载和使用EXERCISES1.1.11.1.21.1.3importjava.util.Scanner;p......
  • 操作系统导论习题解答(27. Thread API)
    Interlude:ThreadAPI带着两个问题学习本章节:OS创造和控制线程预留了什么接口?这些接口是如何被设计以实现易用性和实用性?1.ThreadCreation2.ThreadCompletion......
  • 操作系统导论习题解答(26. Concurrency and Threads)
    Concurrency:AnIntroduction我们这里引入了thread(线程)的概念,与前面所说process(进程)的区别如下:线程之间进行上下文切换地址空间保持不变。每个线程都将有一个stack。......
  • 操作系统导论习题解答(30. Condition Variables)
    ConditionVariables输出结果如下:在多线程情况下我们可以尝试使用共享变量,可以但是效率非常低下:问题来了:在多线程情况下,线程应该如何等待条件?1.DefinitionandRou......
  • 操作系统导论习题解答(29. Locked Data Structures)
    Lock-basedConcurrentDataStructures带着问题:给定一个数据结构,如何给其添加锁使其拥有正确性和高效性?1.ConcurrentCounters1.1SimpleButNotScalable上述代......