首页 > 其他分享 >[SDOI2010] 古代猪文

[SDOI2010] 古代猪文

时间:2023-07-14 14:25:44浏览次数:39  
标签:return int sum register 古代 SDOI2010 pmod binom 猪文

题意

求下列表达式的值

\(\large{g^{\sum_{d|n}{\binom{n}{d}}} \pmod{999911659} }\)

其中,\(n, d \leqslant 10^9.\)

Solution

由欧拉定理可知,

\(\large{ 原式 = g^{\sum_{d|n}{\binom{n}{d}} \pmod{999911658}} }\)

显然只需要考虑分子,考虑到 \(999911658\) 范围下的组合数无法解决,考虑到 \(999911658=2*3*4679*35617\) ,为square-free number,则根据中国剩余定理,考虑分别求出在质数因子下的结果,

$$\begin
x \equiv \sum_{d|n}{\binom} \pmod{2} \
x \equiv \sum_{d|n}{\binom} \pmod{3} \
x \equiv \sum_{d|n}{\binom} \pmod{4679} \
x \equiv \sum_{d|n}{\binom} \pmod{35617} \
\end$$

特解 \(x\) 即为所求。

而对于里面每一个同余方程右侧的结果,Lucas定理可以比较优秀的解决,只需要预处理出阶乘和阶乘的逆元,利用Lucas定理即可求解。

Tips

在Lucas定理运算过程中,可能会出现 $d > n$的情况,需要特判出该种情况下的解 (为 \(0\) ),才能避免RE解出答案。

此外,当 \(g\) 为 \(999911659\) 的倍数时,答案为 \(0\),不能使用欧拉定理进行计算。

Code

点击查看代码
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 4e4 + 50;
const int mod = 999911659;

inline int read() {
	register int w = 0, f = 1;
	register char c = getchar();
	while (c > '9' || c < '0') {
		if (c == '-')  f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		w = w * 10 + c - '0';
		c = getchar();
	}
	return w * f;
}

int n, g;
 
int p;

inline int qpow(register int a, register int b) {
	register int base = 1;
	while (b) {
		if (b & 1)  base = 1ll * base * a % p;
		a = 1ll * a * a % p;
		b >>= 1;
	}
	return base;
}

int mul[N], inv[N];

inline int Comb(register int n, register int m) {
	if (n < m)  return 0;
	if (m == 0)  return 1;
	if (m < p && n < p)  return 1ll * mul[n] * inv[m] % p * inv[n - m] % p;
	return 1ll * Comb(n / p, m / p) * Comb(n % p, m % p) % p;
}

int a[5], m[5];

inline int exgcd(register int a, register int b, int &x, int &y) {
	if (!b) {
		x = 1;
		y = 0;
		return a;
	}
	register int d = exgcd(b, a % b, x, y);
	register int tmp = x;
	x = y;
	y = tmp - a / b * y;
	return d;
}

int a1, m1;

int main() {
	n = read(), g = read();

	if (g % mod == 0) {
		printf("0\n");
		return 0;
	}
	mul[0] = inv[0] = 1;

	m[1] = p = 2;
	for (register int i = 1; i <= p; ++i) {
		mul[i] = 1ll * mul[i - 1] * i % p;
		inv[i] = qpow(mul[i], p - 2);
	}
	for (register int d = 1; d * d <= n; ++d)
		if (n % d == 0) {
			a[1] = (a[1] + Comb(n, d)) % p;
			if (d * d != n)  a[1] = (a[1] + Comb(n, n / d)) % p;
		}
	
	m[2] = p = 3;
	for (register int i = 1; i <= p; ++i) {
		mul[i] = 1ll * mul[i - 1] * i % p;
		inv[i] = qpow(mul[i], p - 2);
	}
	for (register int d = 1; d * d <= n; ++d)
		if (n % d == 0) {
			a[2] = (a[2] + Comb(n, d)) % p;
			if (d * d != n)  a[2] = (a[2] + Comb(n, n / d)) % p;
		}

	m[3] = p = 4679;
	for (register int i = 1; i <= p; ++i) {
		mul[i] = 1ll * mul[i - 1] * i % p;
		inv[i] = qpow(mul[i], p - 2);
	}
	for (register int d = 1; d * d <= n; ++d)
		if (n % d == 0) {
			a[3] = (a[3] + Comb(n, d)) % p;
			if (d * d != n)  a[3] = (a[3] + Comb(n, n / d)) % p;
		}
		
	m[4] = p = 35617;
	for (register int i = 1; i <= p; ++i) {
		mul[i] = 1ll * mul[i - 1] * i % p;
		inv[i] = qpow(mul[i], p - 2);
	}
	for (register int d = 1; d * d <= n; ++d)
		if (n % d == 0) {
			a[4] = (a[4] + Comb(n, d)) % p;
			if (d * d != n)  a[4] = (a[4] + Comb(n, n / d)) % p;
		}
	
	a1 = a[1], m1 = m[1];
	for (register int i = 2; i <= 4; ++i) {
		register int x, y;
		register int g = exgcd(m1, m[i], x, y);
		register int t = m[i] / g;
		x = (x % t + t) % t;
		register int tmp = m1 / g * m[i];
		a1 = (a1 + 1ll * (a[i] - a1) / g * x % tmp * m1 % tmp + tmp) % tmp;
		m1 = tmp;
	}
	a1 = (a1 % (mod - 1) + (mod - 1)) % (mod - 1);

	p = mod;
	printf("%d\n", qpow(g, a1));
	return 0;
}

标签:return,int,sum,register,古代,SDOI2010,pmod,binom,猪文
From: https://www.cnblogs.com/abigjiong/p/17553495.html

相关文章

  • BZOJ 1927: [Sdoi2010]星际竞速 费用流
    1927:[Sdoi2010]星际竞速TimeLimit: 20Sec  MemoryLimit: 259MBSubmit: 2344  Solved: 1442[Submit][Status][Discuss]Description10年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠......
  • 人工智能文化的历史:从古代到现代
    目录人工智能文化的历史:从古代到现代人工智能文化是人类科技发展的一个分支,其历史可以追溯到古代。在古代,人们开始探索使用机器人、计算机和人工智能技术来完成一些任务。例如,在希腊和罗马时期,人们已经开发出了用于计算数学问题的计算机程序。但是,这些计算机程序的主要目的是......
  • 2310考期最新【密训-考前3小时】中国古代文学作品选(二)
    为什么说《待漏院记》一文有很强的逻辑性?[1804简答](1)文章先由“勤”立说,引出待漏院,由待漏院转出“思”字,又由“思”字切入,描写贤、奸两类宰相的不同表现,最后以“慎”字作结,结,点明文章主旨。全文环环相扣,步步深入,具有很强的逻辑性。2.《雨霖铃》(寒蝉凄切)的艺术特色[1910简答......
  • 《二十四孝》是元代郭居业编写的通俗读物,辑录了古代二十四个孝子的故事,后来的印本都配
    《二十四孝》是元代郭居业编写的通俗读物,辑录了古代二十四个孝子的故事,后来的印本都配上图画,通称《二十四孝图》。  下面,我简要概述《二十四孝》中的24个孝的故事。  1、孝感动天  虽然父亲瞽叟、继母和异母弟弟象千方百计想害死舜,舜却丝毫不记恨,依旧孝顺父......
  • 童年丧父的中国古代大文豪
    童年丧父的中国古代大文豪无名无姓但有心反求诸己  颜真卿:三岁时丧父,由母亲殷夫人亲自教育。他长大后,学问渊博,擅长写文章,对母亲殷夫人非常孝顺[6]。开元九年(721年)12岁,七月,颜真卿随殷夫人南下,寄居苏州外祖父家。开元二十一年(733年),他就读于京师长安的福......
  • P2480 古代猪文 题解
    题意:求\[g^{\sum_{k\midn}{n\choosek}}\]对\(999911659\)取模。\(1\len,g\le10^9\)。思路:首先根据欧拉定理,题目转化为求\(\displaystyle\sum_{k\midn}{n\choosek}\)对\(999911658\)取模的值。模数为合数不是很好做,因式分解发现\(999911658=2\times3\times467......
  • P2482 [SDOI2010] 猪国杀
    方法论这是一道复杂的模拟题。由于游戏规则的条目很多,我们需要仔细考虑程序的组织。否则,在编写程序的过程中极容易陷入停滞的状态(不知道下一步应该怎么做),或在发现程序出问......
  • 【洛谷】P2480 [SDOI2010]古代猪文
    原题链接题意求:\[g^{\sum_{d|n}\binom{n}{d}}\mod999911659\]\(n,g\leq10^9\)。思路:因为\(999911659\)是质数,由欧拉定理的推论,可以得到:\[g^{\sum_{d|n}\bino......
  • 6.3 苏格拉底与古代西方主体性思想的萌芽
    苏格拉底对人心的发现苏格拉底的哲学向来被称为什么?被称为是把哲学从天上拉回人间。因为苏格拉底的主题是讨论人生问题的。苏格拉底说过这样一句话:“未经审视的人生是......
  • 古代 ARC 填坑
    因为AGC已经每场写了题解了,所以这里单独记录集训队作业中ARC的部分。一些做过的就不会再写题解了。ARC095F\((\texttt{Easy}\3/1)\)首先给树选定一个根,发现有解......