[WIKIOI1281] Xn数列

↑插播一个广告

给你6个数,m, a, c, x0, n, g

Xn+1 = ( aXn + c ) mod m,求Xn

m, a, c, x0, n, g<=10^18

一行六个数 m, a, c, x0, n, g

输出一个数 Xn mod g

11 8 7 1 5 3

2

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

其实这玩意就是随机数产生器....


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值