首页 > 其他分享 >代码源#960. 一个大整数(用DP实现组合计数)

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

时间:2022-09-01 23:23:29浏览次数:57  
标签: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对。

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

实现:

​ 虽然思路是组合计数,但是略做思考发现通过排列组合很难去处理这类问题,会造成重复的计数。由于每一类球的选取策略很简单,对于第i种球,我们可以做的就是选或者不选,所以可以用\(f[i]\)来表示前i种球我们可以组成的互质因子对数,关系可以通过递推式\(f[i] = (f[i - 1]+f[i-1]*2*c[i])\)获得,记得取模。

#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;
LL f[N]; //前i种质数所组成的个数,对于第i个可以选或者不选

void solve()
{
    scanf("%d", &n);
    f[0] = 1;
    vector<int> p(n + 1), c(n + 1);
    rep(i, 1, n + 1)
        scanf("%d%d", &p[i], &c[i]);

    for(int i = 1; i <= n; i ++)
        f[i] = (f[i - 1] + f[i - 1] * 2ll * c[i]) % mod;
    printf("%lld\n", f[n]);
}

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

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

相关文章

  • Oracle数据库expdp用法
    copy自:Oracle数据库expdp用法以及注意事项一、导出注意事项检查数据库版本(用于决定导出时生成为哪个版本的dmp头文件)selectversionfromv$instance;也可以用sqlplus......
  • 数位dp P3188 [HNOI2007]梦幻岛宝珠-Solution
    数位考虑+背包(+滚动数组)首先,我们能发现,这是一道\(n\)很小但是体积和权值都非常大的背包。但是这个题的体积有一个特殊的性质,就是他是\(a\times2^b,a\leq10\)的形......
  • AOJ 完全背包 数量少体积大价值小版本 dp+贪心
    DPL_1_In和v只有50但体积很大。直接贪心明显过不了一些特殊的数据。考虑答案的构造一堆大的+令一堆大的+...+几个数量少的。前面的肯定是按照贪心选的对于数量少的可......
  • Java获取重复数据并且统计数量
    1、list<dto>List<CollectionItemsTemp>itemsList=newArrayList<>();List<String>nameList=newArrayList<>();if(ToolUtil.isNotEmpty(itemsList)&&......
  • TCP UDP
    无奈被怼了,赶紧梳理一下自己关于tcp和udp所了解的内容TCPTCP是面向连接的传输层协议,可以提供可保的传输服务。而且,TCP提供面向流的全双工通信。TCP在发送数据前需要经过......
  • wordpress如何能实现直接粘贴把图片上传到服务器中
    ​ 当前功能基于PHP,其它语言流程大抵相同。大概流程:1.将docx文件上传到服务器中2.使用PHPoffice/PHPword实现将word转换为HTML3.将HTML代码返回并赋值到编辑器中......
  • 一次对计数问题将常用套路形式化剖析的尝试
    例题:对于所有\(i,j\leqn\),求出\(f_{i,j}\)表示有多少长度为\(i\)的排列\(a\),前\(j\)个位置要满足\(a_j\neqj\).回顾一下错排数的递推式是如何求得的?单独拎出最......
  • 【笔记】入门DP(Ⅱ)
    0X00P1433吃奶酪状压\(DP\),把经过的点压缩成01串。若第\(i\)位为\(0\)表示未到达,为\(1\)则表示已到达。用\(f[i][j]\)表示以\(i\)为起点,经过\(j\)所含\(......
  • ThreadPoolExecutor 线程池的使用
    ThreadPoolExecutor这个类是JDK中的线程池类,继承自Executor,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程。package......
  • [LeetCode] 1315. Sum of Nodes with Even-Valued Grandparent 祖父节点值为偶数的节
    Giventhe root ofabinarytree,return thesumofvaluesofnodeswithan even-valuedgrandparent.Iftherearenonodeswithan even-valuedgrandparent......