快速幂
3641:费马小定理,快速幂加素数判断。
1995:求几个数的幂的和的模。
2429:给出LCM和GCD,逆推a和b,巨疯狂,数据量极大,模拟过不了,可以借鉴此。
模拟型题。
参考程序:
3641:
#include <iostream>
using namespace std;
typedef long long LL;
LL mod_mult(LL a, LL b, LL m)
{
LL res = 0;
LL exp = a % m;
while (b)
{
if (b & 1)
{
res += exp;
if (res > m) res -= m;
}
exp <<= 1;
if (exp > m) exp -= m;
b >>= 1;
}
return res;
}
LL mod_exp(LL a, LL b, LL m)
{
LL res = 1;
LL exp = a % m;
while (b)
{
if (b & 1) res = mod_mult(res, exp, m);
exp = mod_mult(exp, exp, m);
b >>= 1;
}
return res;
}
bool is_prime(const int& n)
{
for (int i = 2; i * i <= n; ++i)
{
if (n % i == 0)
{
return false;
}
}
return n != 1;
}
int main()
{
int p, a;
while (cin >> p >> a && p && a)
{
if (!is_prime(p) && (mod_exp(a, p, p) == a))
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
return 0;
}
1995:
#include <iostream>
using namespace std;
typedef long long LL;
LL mod_mult(LL a, LL b, LL m)
{
LL res = 0;
LL exp = a % m;
while (b)
{
if (b & 1)
{
res += exp;
if (res > m) res -= m;
}
exp <<= 1;
if (exp > m) exp -= m;
b >>= 1;
}
return res;
}
LL mod_exp(LL a, LL b, LL m) {
LL res = 1;
LL exp = a % m;
while (b)
{
if (b & 1) res = mod_mult(res, exp, m);
exp = mod_mult(exp, exp, m);
b >>= 1;
}
return res;
}
int main(int argc, char *argv[])
{
int Z;
cin >> Z;
while (Z--)
{
int M, H;
cin >> M >> H;
int ans = 0;
while (H--)
{
int A_i, B_i;
cin >> A_i >> B_i;
ans += mod_exp(A_i, B_i, M);
}
ans %= M;
cout << ans << endl;
}
return 0;
}