样例全过了,到底是哪错了呢?
#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
*/