感觉柿子应该没有推错,样例过了但是全wa
#include<bits/stdc++.h>
#define LL long long
#define _ 0
#define int long long
using namespace std;
/*Grievous Lady*/
template <typename T> void read(T & t){
t = 0;int f = 1;char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')f =- 1;ch = getchar();}
do{t = t * 10 + ch - '0';ch = getchar();}while(ch >= '0' && ch <= '9');t *= f;
}
#define mod 1000000007
const int kato = 1e6 + 10;
inline LL quick_pow(LL a , LL b){
LL res = 1;
for(; b ; b >>= 1 , a = a * a % mod){
if(b & 1){
res = res * a % mod;
}
}
return res % mod;
}
LL prime[kato] , cnt , f[kato] , invf[kato] , yuni[kato] , mu[kato];
bool ispri[kato];
inline void get_yuni(){
for(int i = 2;i <= kato - 10;i ++){
if(!ispri[i]){
prime[++ cnt] = i;
mu[i] = -1;
}
for(int j = 1;j <= cnt && i * prime[j] <= kato - 10;i ++){
ispri[i * prime[j]] = 1;
if(i % prime[j] == 0){
break;
}
mu[i * prime[j]] = -mu[i];
}
}
for(int i = 2;i <= kato - 10;i ++){
f[i] = (f[i - 1] + f[i - 2]) % mod;
invf[i] = quick_pow(f[i] , mod - 2);
yuni[i] = 1;
}
for(int d = 1;d <= kato - 10;d ++){
if(mu[d] == 1){
for(int Q = d , cnt = 1;Q <= kato - 10;Q += d , cnt ++){
yuni[Q] = yuni[Q] * f[cnt] % mod;
}
}
if(mu[d] == -1){
for(int Q = d , cnt = 1;Q <= kato - 10;Q += d , cnt ++){
yuni[Q] = yuni[Q] * invf[cnt] % mod;
}
}
}
for(int i = 1;i <= kato - 10;i ++){
yuni[i] = yuni[i] * yuni[i - 1] % mod;
}
}
LL n , m , t;
inline int Ame_(){
read(t);
mu[1] = f[1] = invf[1] = yuni[1] = yuni[0] = 1;
get_yuni();
// for(int i = 1;i <= 10;i ++){
// cerr << mu[i] << ' ';
// }
for(; t --> 0 ;){
LL ans = 1;
read(n) , read(m);
if(n > m) swap(n , m);
for(LL l = 1 , r;l <= n;l = r + 1){
r = min(n / (n / l) , m / (m / l));
ans = ans * quick_pow(yuni[r] * quick_pow(yuni[l - 1] , mod - 2) % mod , (n / l) * (m / l)) % mod;
}
printf("%lld\n" , ans);
}
// fclose(stdin);
// fclose(stdout);
return ~~(0^_^0);
}
int Ame__ = Ame_();
signed main(){;}