题目描述
现在有一个非常大的整数 xx,可以将其表示为x=∏ni=1pcii,pi代表一个质数,请问有多少对 x的因子是互质的。
输入描述
第一行输入一个整数 T(1≤T≤102),代表有 T组测试样例。 对于每一个测试样例第一行的输入一个整数n(1≤n≤104)。 接下来 n行,每行两个整数分别代表 pi和 ci,其中 1≤pi,ci≤109,保证pi是一个质数,且互不相同。
输出描述
输出 TT行,每行一个整数代表答案,答案可能会很大,请对 109+7取模。
样例输入
1
2
2 2
3 1
样例输出
15
样例解释
x = 12,因子为1,2,3,4,6,12
互质的因子对为
(1, 1), (1, 2), (1, 3), (1, 4), (1, 6)
(1, 12), (2, 1), (2, 3), (3, 1), (3, 2)
(3, 4), (4, 1), (4, 3), (6, 1), (12, 1)共15对
思路:一个数分解因数时可以被分解成质数的次方之间的乘法。这个题问是让求因数能有多少种组合方式,首先这种组合问题一定是一堆与一堆相乘,得到的结果,这样才能相互组合。因数之间的组合,也就是质数的组合(与指数的次方有关),一个质数有c次方,那么就是c个因数,因为换位后结果是不同的,所以一个质数产生的因数有2*c个,但是假如不选这个质数呢?所以又会产生一种情况,一个质数共有2*c+1种变化,这些东西不能和自己组合,能和别的质数组合,所以是一堆与一堆,所以组合(变化)的质数用乘法想连。
重点:自己只能与某个范围之外的数匹配,那么就会变成一堆与一堆,这样组合的话,用乘法,一堆乘一堆
完整代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=1e4+10;
int a[N];
void solve()
{
int n;
cin>>n;
int res=1;
for(int i=1;i<=n;i++)
{
int p,c;
cin>>p>>c;
res=(res*(2*c+1))%mod;
}
cout<<res<<endl;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}