为啥使用map计算个数,就tle
  • 板块P6298 齿轮
  • 楼主bai1013
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/11/8 15:54
  • 上次更新2023/10/27 03:46:15
查看原帖
为啥使用map计算个数,就tle
536969
bai1013楼主2022/11/8 15:54
#include<bits/stdc++.h>


using namespace std;

#define int long long
#define inf 1e18
#define endl '\n'

typedef pair<int, int>pii;

const int N = 1e6 + 10, mod = 1e9 + 7;

int fact[N];
int infact[N];
int a[N], g[N];

int qumi(int a, int b, int p)
{
    int res = 1;
    while (b)
    {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int cal(int a, int b)
{
    if (a < b) return 0;

    int res = fact[a] * infact[a - b] % mod * infact[b] % mod;
    return res;
}

inline int read() {
    char ch = getchar(); int f = 1; while (ch < '0' || ch>'9') { if (ch == '-') f = -f; ch = getchar(); }
    int x = 0; while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar(); return x * f;
}

signed main()
{
    ios::sync_with_stdio(false); cin.tie(0); cin.tie(0);

    int n, m, k;
    cin >> n >> m >> k;

    fact[0] = infact[0] = 1;
    for (int i = 1; i <= n; i++)
    {
        fact[i] = fact[i - 1] * i % mod;
        infact[i] = infact[i - 1] * qumi(i, mod - 2, mod) % mod;
    }
    /*vector<int>a(n + 1);*/
    map<int, int>mp;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
      
        mp[a[i]]++;
    }
  /*  vector<int>g(m + 1, 0);*/
    for (int i = m; i >= 1; i--)
    {
        int res = 0;
        for (int j = 1; j * i <= m; j++)
        {
            res += mp[i * j];
            // 先容斥减掉,然后再求得最后只
            g[i] = (g[i] - g[i * j] + mod) % mod;
        }

        g[i] += ((cal(res, k) % mod + mod) % mod);
    }
    for (int i = 1; i <= m; i++) cout << g[i] % mod << " ";

    return 0;
}
2022/11/8 15:54
加载中...