↑插播一个广告
题目描述 Description
给你6个数,m, a, c, x0, n, g
Xn+1 = ( aXn + c ) mod m,求Xn
m, a, c, x0, n, g<=10^18
输入描述 Input Description
一行六个数 m, a, c, x0, n, g
输出描述 Output Description
输出一个数 Xn mod g
样例输入 Sample Input
11 8 7 1 5 3
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
int64按位相乘可以不要用高精度。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long m, a, c, x0, n, g;
template <int A, int B>
struct matrix
{
long long v[A][B];
matrix(long long r = 0)
{
memset(v, 0, sizeof(v));
for (int i = 0; i < A && i < B; i++)
v[i][i] = r;
}
matrix(long long a[A][B])
{
memcpy(v, a, sizeof(a));
}
};
inline long long quickadd(long long a, long long b)
{
long long ans = 0;
for (; b; b >>= 1)
{
if (b & 1) ans = (ans + a) % m;
a = (a + a) % m;
}
return ans;
}
template <int A, int B, int C>
matrix <A, C> operator * (const matrix <A, B> &a, const matrix <B, C> &b)
{
matrix <A, C> ans;
for (int i = 0; i < A; i++)
for (int j = 0; j < C; j++)
{
long long v = 0;
for (int k = 0; k < B; k++)
v += quickadd(a.v[i][k], b.v[k][j]);
ans.v[i][j] = (v % m + m) % m;
}
return ans;
}
template <int A>
matrix <A, A> power(const matrix<A, A> &a, long long b)
{
matrix <A, A> ans = 1;
for (matrix<A, A> i = a; b; b >>= 1)
{
if (b & 1) ans = ans * i;
i = i * i;
}
return ans;
}
matrix <2, 2> w;
matrix <1, 2> x;
int main()
{
scanf("%lld%lld%lld%lld%lld%lld", &m, &a, &c, &x0, &n, &g);
w.v[0][0] = a;
w.v[1][0] = w.v[1][1] = 1;
x.v[0][0] = x0;
x.v[0][1] = c;
printf("%lld\n", (x * power(w, n)).v[0][0] % g);
return 0;
}
其实这玩意就是随机数产生器....