NOIP模拟(10.24)T3 Math

来源:互联网 发布:雅尔塔体系 知乎 编辑:程序博客网 时间:2024/05/29 15:24

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;}