ZUFE-无人能解的数学难题




解题思路:怎么都没想到题目描述里的233是有用的,可以发现a[1]=23+1+f[1],a[2]=233+2+f[2],a[3]=2333+3+f[3],所以令: a[x]=g[x]+h[x]+f[x]那么: h[x]=h[x−1]+1,g[x]=g[x−1]*10+3

得到一系列递推式:f[x]=A*f[x-1]+B*f[x−2],h[x]=h[x-1]+1,g[x]=g[x-1]*10+3,,a[x]=g[x]+h[x]+f[x],s[x]=s[x-1]+a[x],ans[x]=ans[x-1]+s[x]

然后就可以构造矩阵,用矩阵快速幂求解



#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <climits>

using namespace std;

#define LL long long
const int INF = 0x3f3f3f3f;

struct Matrix
{
	LL v[15][15];
	Matrix()
	{
		memset(v, 0, sizeof v);
	}
} dan;
LL a, b, ans1, ans2, f2, mod, l, r;

Matrix mul(Matrix a, Matrix b, int d)
{
	Matrix ans;
	for (int i = 1; i <= d; i++)
	{
		for (int j = 1; j <= d; j++)
		{
			for (int k = 1; k <= d; k++)
			{
				ans.v[i][j] = ans.v[i][j] + (a.v[i][k] * b.v[k][j]) % mod;
				ans.v[i][j] %= mod;
			}
		}
	}
	return ans;
}

Matrix pow(Matrix a, LL k, int d)
{
	Matrix ans = dan;
	while (k)
	{
		if (k & 1) ans = mul(ans, a, d);
		k >>= 1;
		a = mul(a, a, d);
	}
	return ans;
}

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		Matrix x, ans;
		scanf("%lld %lld %lld %lld %lld", &a, &b, &l, &r, &mod);
		f2 = (b%mod * 1995 + a%mod * 1129) % mod;
		dan.v[1][1] = f2;
		dan.v[1][2] = (a%mod*f2 + b%mod * 1129) % mod;
		dan.v[1][3] = 2333; dan.v[1][4] = 3;
		dan.v[1][5] = 235 + f2;
		dan.v[1][6] = 3150;
		dan.v[1][7] = 1997;
		dan.v[1][8] = 1;

		x.v[2][1] = 1;
		x.v[1][2] = b, x.v[2][2] = a;
		x.v[3][3] = 10, x.v[8][3] = 3;
		x.v[4][4] = 1, x.v[8][4] = 1;
		x.v[2][5] = 1, x.v[3][5] = 1, x.v[4][5] = 1;
		x.v[5][6] = x.v[6][6] = x.v[6][7] = x.v[7][7] = x.v[8][8] = 1;

		l--;
		if (l == -1) ans1 = 0;
		else if (l == 0) ans1 = 1997;
		else
		{
			ans = pow(x, l, 8);
			ans1 = ans.v[1][7];
		}
		if (r == 0) ans2 = 1997;
		else
		{
			ans = pow(x, r, 8);
			ans2 = ans.v[1][7];
		}
		printf("%lld\n", (ans2 - ans1 + mod) % mod);
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值