NOIP模拟(10.24)T3 Math

本文详细解析了10.24 NOIP模拟赛T3题目的解题思路,针对a、b两数的不同奇偶性进行了深入分析,并给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Math

题目背景:

10.24 NOIP模拟T3

分析:结论 + 分析

 

这题还是比较妙的感觉上,首先ab如果满足条件那么ab的奇偶性一定相同。那么我们来分情况讨论下。

1a, b为奇数

a2 = b2 = 1(mod 8) à ab = ba = a = b (mod 8)

a4 = b4 = 1(mod 16) à ab = ba = a(b % 4) = b(a % 4)(mod16)

因为a % 8 == b % 8那么a % 4 == b % 4, 因为b % 4为奇数,那么令a % 4 = 2 * k +1, 那么a2 * k + 1 = b2 * k + 1 (mod16),因为我们可以知道两个数的奇数次方的差值都可以分解为(a - b) * (a2 * k + a2 * k - 1 * b + a2 *k - 2 * b2 +  + b2 * k),后面的每一项都是一定是奇数(底数为奇数,指数和为奇数)一共有奇数项,所以后面一定为奇数,然后因为上式(mod 16)应该为0,那么(a - b) = 0 (mod 16) à a = b (mod 16)

那么以此类推可以知道,a = b(mod 2n)所以只存在唯一解b = a % 2n

 

2a, b为偶数
显然当b >= n时,ab = 0 (mod 2n),那么ba = 0 (mod2n)那么,我们令b = 2k * c, 那么ba = 2ka * ca显然,ca 为奇数与2n 互质,所以2ka =0 (mod 2n)那么,ka >= n, 那么k >= n / a所以b至少需要时2k的倍数,k为满足k * a >= n的最小的自然数,那么b >= n的贡献就非常好求啦,然后对于b < n的部分,看到没n <= 30,暴力即可······

 

Source

/*
	created by scarlyw
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <set>
#include <map>
#include <vector>
#include <queue>

int mod, a, n, t;
inline int ksm(int a, int b) {
	int ans = 1;
	for (; b; b >>= 1, a = (long long)a * (long long)a % mod)
		if (b & 1) ans = (long long)ans * (long long)a % mod;
	return ans;
}
 
inline void solve() {
	scanf("%d%d", &a, &n), mod = (1 << n);
	if (a & 1) std::cout << "1\n";
	else {
		int temp = n / a;
		if (temp * a < n) temp++;
		int ans = mod / (1 << temp) - n / (1 << temp);
		for (int i = 1; i <= n; ++i)
			if (ksm(a, i) == ksm(i, a)) ans++;
		std::cout << ans << '\n';
	}
}
 
int main() {
	scanf("%d", &t);
	while (t--) solve();
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值