• LightOJ 1161


    **题意:**给你n个数[4,10000],问在其中任意选四个其GCD值为1的情况有几种。 **思路:**GCD为1的情况很简单 即各个数没有相同的质因数,所以求所有出现过的质因数次数再容斥一下…… 很可惜是错的,因为完全有可能某四个数有两个公共质因数,所以还是使用普通的因子分解
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <utility>
    #include <vector>
    #include <map>
    #include <set>
    #include <string>
    #include <stack>
    #include <queue>
    #define LL long long
    #define MMF(x) memset((x),0,sizeof(x))
    #define MMI(x) memset((x), INF, sizeof(x))
    using namespace std;

    const int INF = 0x3f3f3f3f;
    const int N = 1e4+20;

    LL mar[N];
    LL ans[N];
    LL C4(LL n)//组合数4的函数
    {
    return n*(n-1)*(n-2)*(n-3)/24;
    }
    void rec(int n)//分解因子 并记录个数
    {
    for(int i = 1; i*i <= n; i++)
    {
    if(n % i == 0)
    {
    mar[i]++;
    if(n / i != i)
    mar[n/i]++;
    }
    }
    }

    int main()
    {
    // prime();
    int T;
    int cnt = 0;
    cin >> T;
    while(T--)
    {
    int n;
    scanf("%d", &n);
    MMF(mar);
    for(int i = 0; i < n; i++)
    {
    int t;
    scanf("%d", &t);
    rec(t);
    }
    for (int i = 10000; i >= 1; --i) {
    ans[i] = C4(mar[i]);
    for (int j = 2 * i; j <= 10000; j += i)
    {
    ans[i] -= ans[j];
    }
    }
    printf("Case %d: %lld ", ++cnt, ans[1]);
    }
    return 0;
    }
    //刚开始想找质因数排列组合 WA后一想 可能存在这种情况:某4个数的 相同质因数 有两种,这样后的容斥情况重复了
  • 相关阅读:
    c#驱动操作mongodb辅助类MongoDBHelper
    c#多线程lock无效
    利用Aspose.Words将html转成pdf和将html转成word
    前后端值映射的问题
    本机部署流程详解
    Git 安装配置手册
    js对象数组(JSON) 根据某个共同字段 分组
    jquery中的$.fn的用法
    JSON.parse()与JSON.stringify()的区别
    添加编辑 时 数据不可重复验证
  • 原文地址:https://www.cnblogs.com/Yumesenya/p/6008184.html
Copyright © 2020-2023  润新知