ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

代码源#960. 一个大整数(用DP实现组合计数)

2022-09-01 23:33:19  阅读:138  来源: 互联网

标签:ch 960 int 计数 因子 12 互质 DP define


题目:

​ 给出一个很大的整数x,以质因数分解的方式给出,请问有多少对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对。

​ 通过简单的猜想,我们可以得出结论,同一个质因子的不同次幂数不能组成互质的因子对,而质因数(也就是底数)不同的一定可以构成互质的因子对。因此,我们可以将问题抽象成一个取球问题,每个质因数代表一个种类的球,这种球的个数就是该质因数的次幂,那么我们要做的就是任取两种球组成一对。

实现:

​ 虽然思路是组合计数,但是略做思考发现通过排列组合很难去处理这类问题,会造成重复的计数。我们突然发现每一类球的选取策略很简单,对于一种球,我们有三种处理方式,第一是把他放在左边,第二把他放在右边,第三就是不放他。那么答案就是\(\prod_{i=1}^n(2 * c_i + 1)\)

#include <bits/stdc++.h>
    
using namespace std;
#define rep(i, a, n) for(int i = a; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define ios ios::sync_with_stdio(false);cin.tie(0);
#define debug(x)    cout << x << endl;
#define SZ(x)    (int)x.size()
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f;
void read(int &x) {int s = 0, f = 1; char ch = getchar(); while(!isdigit(ch)) {f = (ch == '-' ? -1 : f); ch = getchar();} while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = getchar();} x = s * f;}

const int mod = 1e9 + 7;
const int N = 10005;
int n;

void solve()
{
    scanf("%d", &n);
    int p, c;
    rep(i, 1, n + 1)
        scanf("%d%d", &p, &c), res = res * (2ll * c + 1) % mod;
    printf("%lld"\n, res);
}

signed main()
{
    int _ = 1;
    scanf("%d", &_);
    while(_--)
        solve();
}

标签:ch,960,int,计数,因子,12,互质,DP,define
来源: https://www.cnblogs.com/DM11/p/16648172.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有