Daimayuan Online Judge 一个大整数

题目描述

现在有一个非常大的整数 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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值