http://codeforces.com/contest/645/problem/F
F. Cowslip Collections
time limit per test

8 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

In an attempt to make peace with the Mischievious Mess Makers, Bessie and Farmer John are planning to plant some flower gardens to complement the lush, grassy fields of Bovinia. As any good horticulturist knows, each garden they plant must have the exact same arrangement of flowers. Initially, Farmer John has n different species of flowers he can plant, with ai flowers of the i-th species.

On each of the next q days, Farmer John will receive a batch of flowers of a new species. On day j, he will receive cj flowers of the same species, but of a different species from those Farmer John already has.

Farmer John, knowing the right balance between extravagance and minimalism, wants exactly k species of flowers to be used. Furthermore, to reduce waste, each flower of the k species Farmer John chooses must be planted in some garden. And each of the gardens must be identical; that is to say that each of the k chosen species should have an equal number of flowers in each garden. As Farmer John is a proponent of national equality, he would like to create the greatest number of gardens possible.

After receiving flowers on each of these q days, Farmer John would like to know the sum, over all possible choices of k species, of the maximum number of gardens he could create. Since this could be a large number, you should output your result modulo 109 + 7.

Input

The first line of the input contains three integers n, k and q (1 ≤ k ≤ n ≤ 100 000, 1 ≤ q ≤ 100 000).

The i-th (1 ≤ i ≤ n) of the next n lines of the input contains an integer ai (1 ≤ ai ≤ 1 000 000), the number of flowers of species i Farmer John has initially.

The j-th (1 ≤ j ≤ q) of the next q lines of the input contains an integer cj (1 ≤ cj ≤ 1 000 000), the number of flowers of a new species Farmer John receives on day j.

Output

After each of the q days, output the sum of the maximum possible number of gardens, where the sum is taken over all possible choices of k species, modulo 109 + 7.

Examples
Input
3 3 2
4
6
9
8
6
Output
5
16
Input
4 1 2
6
5
4
3
2
1
Output
20
21
Note

In the first sample case, after the first day Farmer John has (4, 6, 9, 8) of each type of flower, and k = 3.

Choosing (4, 6, 8) lets him make 2 gardens, each with (2, 3, 4) of each flower, respectively. Choosing (4, 6, 9), (4, 9, 8) and (6, 9, 8) each only let him make one garden, since there is no number of gardens that each species can be evenly split into. So the sum over all choices of k = 3 flowers is 2 + 1 + 1 + 1 = 5.

After the second day, Farmer John has (4, 6, 9, 8, 6) of each flower. The sum over all choices is 1 + 2 + 2 + 1 + 1 + 2 + 2 + 3 + 1 + 1 = 16.

In the second sample case, k = 1. With x flowers Farmer John can make x gardens. So the answers to the queries are 6 + 5 + 4 + 3 + 2 = 20 and 6 + 5 + 4 + 3 + 2 + 1 = 21.

题意:

n,k,q <= 10^5,ai <= 10^6

一个数组,初始长度为n,元素为a1~an

接下来有q天,每一天会向数组里面新加入一个数,第i天元素个数有n + i个

数组取k个元素有C(n + i , k )种方案,求每一个种方案的k的数的gcd之和

思路:

这道题目明显具有阶段性,向其中加入一个数cur后,求解ans不用重新计算一遍,只需要考虑cur取的情况,再从之前的数中取k - 1 个数(1),求gcd之和,再累加上以前的答案即可

对于(1)所有方案,gcd一定是cur的约数,所以我们考虑枚举cur的约数

用一个数组f[i]表示cur之前的数中,是i的倍数的数的个数

对于约数x

ans += C(f[x],k - 1) * x,但是此时把一些gcd是x的倍数的情况也算进去了

反过来说,对于x,我们要把x的约数多算的部分给退回去,差不多就是容斥那样

推一下公式,定义

g[i] = i - sigma(g[d],d < i && d | i)

这样相当于是给每一个数一个权值,这样就不用再去考虑重复计算的情况了

这样对于cur的约数x

ans += C(f[x],k - 1) * g[x]

复杂度O(sqrt(10^6)) = O(10^3)

总复杂度 = O(10 ^ 9 + 10 ^ 3 * 10 * 5) = O(10 ^ 9 + 10 ^ 8)

1.预处理:

jie[i] = i!

comb[i] = C(i,k - 1)

g[i] = i - sigma(g[d],d < i && d | i) (1 <= i <= 10 ^ 6,d是i的约数且 != i)

(预处理g的复杂度=10 ^ 6 * 10 ^ 3 = 10 ^ 9)

   //File Name: cf645F.cpp
//Author: long
//Mail: 736726758@qq.com
//Created Time: 2016年05月15日 星期日 19时58分07秒 #include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <vector>
#include <math.h> #define LL long long
#define pb push_back using namespace std; const int MAXN = + ;
const int MAXM = + ;
const int MOD = (int)1e9 + ; LL jie[MAXN << ];
LL comb[MAXN << ];
LL ans;
int g[MAXM];
int f[MAXM];
vector<int> di; void get_di(int x){
di.clear();
int ma = (int)sqrt(x + 0.5);
for(int i=,j;i<=ma;i++){
if(x % i == ){
di.pb(i);
j = x / i;
if(j != i)
di.pb(j);
}
}
} LL qp(LL x){
LL res = ,y = MOD - ;
while(y){
if(y & ) res = res * x % MOD;
x = x * x % MOD;
y >>= ;
}
return res;
} void init(int n,int k){
ans = ;
jie[] = ;
for(int i=;i<=n;i++){
jie[i] = jie[i - ] * i % MOD;
}
for(int i=;i<=n;i++){
if(i < k) comb[i] = ;
else comb[i] = jie[i] * qp(jie[k] * jie[i - k] % MOD) % MOD;
}
for(int i=,ma;i<=MAXM;i++){
g[i] = i;
get_di(i);
ma = di.size();
for(int j=;j<ma;j++){
if(di[j] == i) continue;
g[i] -= g[di[j]];
}
}
} void query(int x){
get_di(x);
int ma = di.size();
for(int i=;i<ma;i++){
(ans += comb[f[di[i]]++] * g[di[i]] % MOD ) %= MOD;
}
} void solve(int n,int k,int q){
init(n + q,k - );
for(int i=,a;i<=n;i++){
scanf("%d",&a);
query(a);
}
for(int i=,a;i<=q;i++){
scanf("%d",&a);
query(a);
printf("%d\n",ans);
}
} int main(){
int n,k,q;
scanf("%d %d %d",&n,&k,&q);
solve(n,k,q);
return ;
}

cf 645F Cowslip Collections 组合数学 + 简单数论的更多相关文章

  1. CROC 2016 - Elimination Round (Rated Unofficial Edition) F - Cowslip Collections 数论 + 容斥

    F - Cowslip Collections http://codeforces.com/blog/entry/43868 这个题解讲的很好... #include<bits/stdc++.h ...

  2. (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)

    题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...

  3. 简单数论之整除&质因数分解&唯一分解定理

    [整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"b整除a"或"a能被b整除".b叫做a的约数(或因数),a ...

  4. 2018.12.17 bzoj1406 : [AHOI2007]密码箱(简单数论)

    传送门 简单数论暴力题. 题目简述:要求求出所有满足x2≡1mod&ThinSpace;&ThinSpace;nx^2\equiv1 \mod nx2≡1modn且0≤x<n0\ ...

  5. CF 984C Finite or not? (数论)

    CF 984C Finite or not? (数论) 给定T(T<=1e5)组数据,每组数据给出十进制表示下的整数p,q,b,求问p/q在b进制意义下是否是有限小数. 首先我们先把p/q约分一 ...

  6. Pairs Forming LCM (LightOJ - 1236)【简单数论】【质因数分解】【算术基本定理】(未完成)

    Pairs Forming LCM (LightOJ - 1236)[简单数论][质因数分解][算术基本定理](未完成) 标签: 入门讲座题解 数论 题目描述 Find the result of t ...

  7. Help Hanzo (LightOJ - 1197) 【简单数论】【筛区间质数】

    Help Hanzo (LightOJ - 1197) [简单数论][筛区间质数] 标签: 入门讲座题解 数论 题目描述 Amakusa, the evil spiritual leader has ...

  8. Aladdin and the Flying Carpet (LightOJ - 1341)【简单数论】【算术基本定理】【分解质因数】

    Aladdin and the Flying Carpet (LightOJ - 1341)[简单数论][算术基本定理][分解质因数](未完成) 标签:入门讲座题解 数论 题目描述 It's said ...

  9. Sigma Function (LightOJ - 1336)【简单数论】【算术基本定理】【思维】

    Sigma Function (LightOJ - 1336)[简单数论][算术基本定理][思维] 标签: 入门讲座题解 数论 题目描述 Sigma function is an interestin ...

随机推荐

  1. AI编辑SVG格式的相关问题

    制作SVG:1.需要给每个图层命名,生成的SVG文件的(表示一个路径,另外还有标签等)标签就会有个id属性是这个图层的名字2.保存的时候内嵌文字可以保存为SVG或转为path格式,如果没有文字,则无所 ...

  2. 文件的搜寻【转vbird】

    which (寻找『运行档』) [root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 分 ...

  3. 在Windows7上安装coreseek3.2同时在PHP下简单实现步骤

    这两天安装了coreseek+sphinx服务,前面装的是比较低版本的,再试了一下官网比较稳定一个版本1.首先下载:因为包有点大,就不在这里增加链接了,需要可以到官网下载 coreseek-3.2.1 ...

  4. 开发环境安装 Java Mysql MyEclipse Android Adt

    一.安装 JDK 1.官网下载JDK最新版本,下载地址如下: http://www.oracle.com/technetwork/java/javase/downloads/index.html 这里 ...

  5. Quarzt.NET 任务调度框架

      Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性 ...

  6. Q7: Unique Binary Search Trees

    问题描述: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For ...

  7. CentOS6.4系统启动失败故障排查

    转:http://www.centoscn.com/CentosBug/osbug/2014/1028/4011.html 操作系统启动失败如下图报错: 故障现象: 从图中可以看到,操作系统启动的过程 ...

  8. Android 三种方式实现自定义圆形页面加载中效果的进度条

    转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...

  9. 百度ueditor学习使用

    1.下载ueditor解压 2. jsp里存放着开发所用到的jar包,导入项目即可 前端页面代码如下: <center> <form action="" meth ...

  10. IDEA快捷键大全

    IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Sh ...