15分求调
查看原帖
15分求调
490978
小超手123楼主2024/3/22 07:37

样例全过了,到底是哪错了呢?

#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
#define N 100
using namespace std;
int T, p, n, m, lenA, lenB;
int A[N], B[N];
int f[N][2][2][2];
int Pow(int a, int n) {
	if(n == 0) return 1;
	if(n == 1) return a;
	int x = Pow(a, n / 2);
	if(n % 2 == 0) return x * x % mod;
	else return x * x % mod * a % mod;
}
int inv(int x) {
	return Pow(x, mod - 2);
}
int dfs(int Pos, int lim1, int lim2, bool ok) {
	if(Pos == 0) {
		if(ok) return 1;
		else return 0;
	}
	if(f[Pos][lim1][lim2][ok] != -1) return f[Pos][lim1][lim2][ok];
	int R1 = (lim1 ? A[Pos] : (p - 1)), R2 = (lim2 ? B[Pos] : (p - 1));
	int res = 0;
	for(int i = 0; i <= R1; i++)
	for(int j = 0; j <= R2; j++) {
		res += dfs(Pos - 1, lim1 && (i == R1), lim2 && (j == R2), ok || (i < j));
		res %= mod;
	}
	return f[Pos][lim1][lim2][ok] = res;
}
int Sol() {
	int nn = n, mm = m;
	memset(f, -1, sizeof(f));
	memset(A, 0, sizeof(0));
	memset(B, 0, sizeof(0));
	lenA = lenB = 0;
	while(n) {
		A[++lenA] = n % p;
		n /= p;
	}
	while(m) {
		B[++lenB] = m % p;
		m /= p;
	}
	int res = dfs(max(lenA, lenB), 1, 1, 0);
	if(nn >= mm) nn = mm - 1;
	int now = ((nn % mod + 1) * (mm % mod) % mod - (1 + nn % mod) * (nn % mod) % mod * inv(2) % mod + mod) % mod;
	return (res - now + mod) % mod;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> T >> p;
	while(T--) {
		cin >> n >> m;
		cout << Sol() << endl;
	}

	return 0;
}
/*
1 5
4 5
*/
2024/3/22 07:37
加载中...