本文主要是介绍NOIP模拟(10.24)T3 Math,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Math
题目背景:
分析:结论 + 分析
这题还是比较妙的感觉上,首先a,b如果满足条件那么a,b的奇偶性一定相同。那么我们来分情况讨论下。
1、a, 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;
2、a, 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;
}
这篇关于NOIP模拟(10.24)T3 Math的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!