先放知识点:

莫比乌斯反演

卢卡斯定理求组合数

乘法逆元

快速幂取模

GCD of Sequence

 Alice is playing a game with Bob.
Alice shows N integers a 1, a 2, …, a N, and M, K. She says each integers 1 ≤ a i ≤ M.
And now Alice wants to ask for each d = 1 to M, how many different sequences b 1, b 2, …, b N. which satisfies :
1. For each i = 1…N, 1 ≤ b[i] ≤ M
2. gcd(b 1, b 2, …, b N) = d
3. There will be exactly K position i that ai != bi (1 ≤ i ≤ n) Alice thinks that the answer will be too large. In order not to annoy Bob, she only wants to know the answer modulo 1000000007.Bob can not solve the problem. Now he asks you for HELP!
Notes: gcd(x 1, x 2, …, x n) is the greatest common divisor of x 1, x 2, …, x n

Input

The input contains several test cases, terminated by EOF.
The first line of each test contains three integers N, M, K. (1 ≤ N, M ≤ 300000, 1 ≤ K ≤ N)
The second line contains N integers: a 1, a 2, …, a n (1 ≤ a i ≤ M) which is original sequence.

Output

For each test contains 1 lines :
The line contains M integer, the i-th integer is the answer shows above when d is the i-th number.

Sample Input

3 3 3
3 3 3
3 5 3
1 2 3
1
2
3
4

Sample Output

7 1 0
59 3 0 1 1
1
2

Hint

In the first test case :
when d = 1, {b} can be :
(1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 2, 2)
(2, 1, 1)
(2, 1, 2)
(2, 2, 1)
when d = 2, {b} can be :
(2, 2, 2)
And because {b} must have exactly K number(s) different from {a}, so {b} can't be (3, 3, 3), so Answer = 0







卢卡斯求组合数是log级别的所以没问题

#include <bits/stdc++.h>
using namespace std;
const int maxn = 310000;
const int mod = 1000000007;
int n, m, k;
int prime[maxn], tot, mu[maxn]; //莫比乌斯函数
bool vis[maxn];
long long fac[maxn], rev[maxn]; //乘法逆元,和卢卡斯定理
long long F[maxn], f[maxn]; //莫比乌斯反演
int a[maxn];
int cnt[maxn]; //对于d,有多少a[i]是d的倍数
long long extend_gcd(long long a, long long b, long long &x, long long &y)
{
//扩展欧几里得
if (a == 0 && b == 0)
return -1;
if (b == 0)
{
x = 1;
y = 0;
return a;
}
long long d = extend_gcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
long long mod_rev(long long a, long long n) //乘法逆元lucas用
{
long long x, y;
long long d = extend_gcd(a, n, x, y);
if (d == 1)
return (x % n + n) % n;
else
return -1;
} void init() //线性筛求莫比乌斯函数
{
tot = 0;
mu[1] = 1;
for (int i = 2; i < maxn; i++)
{
if (!vis[i])
{
prime[tot++] = i;
mu[i] = -1;
}
for (int j = 0; j < tot; j++)
{
if (i * prime[j] >= maxn)
break;
vis[i * prime[j]] = 1;
if (i % prime[j] == 0)
{
mu[i * prime[j]] = 0;
break;
}
else
{
mu[i * prime[j]] = -mu[i];
}
}
}
fac[0] = rev[0] = 1;
for (int i = 1; i < maxn; i++)
{
fac[i] = fac[i - 1] * i % mod;
//预处理卢卡斯定理参数
rev[i] = mod_rev(fac[i], mod);
//预处理逆元
}
} long long quick_mod(long long a, long long b)
{
long long ans = 1;
a %= mod;
while (b)
{
if (b & 1)
{
ans = ans * a % mod;
b--;
}
b >>= 1;
a = a * a % mod;
}
return ans;
} long long Lucas(long long m, long long n)
{
if (n == 0)
return 1;
long long ans = fac[m] * rev[n] % mod * rev[m - n] % mod;
return ans;
} int main()
{
init();
while (scanf("%d%d%d", &n, &m, &k) != EOF)
{
memset(cnt, 0, sizeof cnt);
memset(f, 0, sizeof f);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
cnt[a[i]]++;
}
for (int i = 1; i <= m; i++)
for (int j = i + i; j <= m; j += i)
cnt[i] += cnt[j]; for (int i = 1; i <= m; i++)
{
long long p = cnt[i];
if (k - n + p < 0)
{
F[i] = 0;
continue;
}
F[i] = Lucas(p, k - n + p) * quick_mod(m / i - 1, k - n + p) % mod * quick_mod(m / i, n - p) % mod;
} for (int i = 1; i <= m; i++)
{
if (F[i] == 0)
f[i] = 0; else
for (int j = i; j <= m; j += i)
{
f[i] += mu[j / i] * F[j];
f[i] %= mod;
}
printf("%lld", (f[i] + mod) % mod);
if (i != m)
printf(" ");
}
printf("\n");
}
return 0;
}

数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)的更多相关文章

  1. HDU - 4675 GCD of Sequence (莫比乌斯反演+组合数学)

    题意:给出序列[a1..aN],整数M和k,求对1-M中的每个整数d,构建新的序列[b1...bN],使其满足: 1. \(1 \le bi \le M\) 2. \(gcd(b 1, b 2, -, ...

  2. HDU 1061 Rightmost Digit --- 快速幂取模

    HDU 1061 题目大意:给定数字n(1<=n<=1,000,000,000),求n^n%10的结果 解题思路:首先n可以很大,直接累积n^n再求模肯定是不可取的, 因为会超出数据范围, ...

  3. hdu 1097 A hard puzzle 快速幂取模

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1097 分析:简单题,快速幂取模, 由于只要求输出最后一位,所以开始就可以直接mod10. /*A ha ...

  4. 杭电 2817 A sequence of numbers【快速幂取模】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2817 解题思路:arithmetic or geometric sequences 是等差数列和等比数 ...

  5. HDU 4675 GCD of Sequence (2013多校7 1010题 数学题)

    GCD of Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)T ...

  6. 数学--数论--HDU 5382 GCD?LCM?(详细推导,不懂打我)

    Describtion First we define: (1) lcm(a,b), the least common multiple of two integers a and b, is the ...

  7. 【数论】【欧拉函数】【筛法求素数】【乘法逆元】【快速幂取模】bzoj2186 [Sdoi2008]沙拉公主的困惑

    http://www.cnblogs.com/BLADEVIL/p/3490321.html http://www.cnblogs.com/zyfzyf/p/3997986.html 翻了翻题解,这两 ...

  8. HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解

    题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...

  9. HDU 4675 GCD of Sequence(容斥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给出n,m,K,一个长度为n的数列A(1<=A[i]<=m).对于d(1< ...

随机推荐

  1. 2017蓝桥杯Excel地址(C++C组)

    题目:Excel地址Excel单元格的地址表示很有趣,它使用字母来表示列号.比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,....当然Exce ...

  2. jQuery extend()和jQuery.fn.extend()区别和详解

    1.认识jQuery extend()和jQuery.fn.extend() jQuery的API手册中,extend方法挂载在jQuery和jQuery.fn两个不同对象上方法,但在jQuery内部 ...

  3. "一号标题"组件:<h1> —— 快应用组件库H-UI

     <import name="h1" src="../Common/ui/h-ui/text/c_h1"></import> < ...

  4. 答好友困惑:Java零基础如何入门,不知道怎么学,迷茫ING

    作者:程序员小跃 几个星期之前,我在知乎上看到一个提问,说是:对于完全没有经验零基础自身的数学底子也很弱学习Java应该怎么学习呢?想着类似的问题我也有过回答,并且反馈还是蛮好的,就参考之前的思路回答 ...

  5. 008-进制-C语言笔记

    008-进制-C语言笔记 学习目标 1.[掌握]include预处理指令 2.[掌握]多文件开发 3.[了解]认识进制 4.[掌握]进制之间的互相转换 5.[掌握]原码,反码,补码 6.[掌握]位运算 ...

  6. 千亿级平台技术架构:为了支撑高并发,我把身份证存到了JS里

    @ 目录 一.用户信息安全规范 1.1 ​用户信息.敏感信息定义及判断依据 1.1.1 个人信息 1.1.2 个人敏感信息 1.2 ​用户信息存储的注意事项 二.​框架技术实现 2.1 用户敏感信息自 ...

  7. 小程序运行时如何助力传统APP转型?

    小程序和H5或者RN有什么区别?优越性在哪里? 长期以来,移动互联网界一直在寻找一种既能获得Native原生的体验,又可以低门槛快速开发的技术.在这个过程中出现了很多尝试,例如React Native ...

  8. stand up meeting 12/4/2015 -12/6/2015

    part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云        ------  --- 数据库 朱玉影  等待张葳出关        0  foxit reader  6 ...

  9. 前端学习笔记-H5

    H5常用标签及其属性: <a>标签做超链接: <p>段落标签,自带段间距和换行样式: <div>块标签,表示一块内容,没有具体语意,区别与p标签,块与块间没有间距: ...

  10. vue2.x学习笔记(七)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12576797.html. 条件渲染 vue也提供了一些指令,用于条件性地渲染模板中的内容. [v-if]和[v-e ...