函数求和
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

一条直线上有n个点,对于第i个点有一个给定的L_i ,代表可以任选一个点i号点连接,连接的代价是gcd(s,i),点可以和自身连接。

定义f(i)i号点与任选一个点连接的最小代价。

给出m个询问,每次询问给出一个x,代表询问f(x)的值,然而对于每一个询问都输出一个答案实在是太麻烦了,所以我们只需要输出所有询问的答案之和。

由于这个数字可能很大,你只需要输出它对取模的结果。

gcd(x,y)表示xy的最大公约(因)数。

由于本题输入量较大,请使用以下快读函数代替你的scanf或cin输入


inline void read(int &num)
{
int s = 0 ; char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9') s = (s<<3) + (s<<1) + ch - '0', ch = getchar();
num = s;
}

输入描述:

第一行两个整数

第二行n个整数,第i个整数代表L_i

接下来m行,代表m个询问。

输出描述:

一个整数,代表所有询问答案之和对取模的结果。
示例1

输入

复制
3 3
1 1 1
1
2
3

输出

复制
3