Pagini recente » Cod sursa (job #652928) | Cod sursa (job #901585) | Cod sursa (job #145163) | Cod sursa (job #3227778) | Cod sursa (job #1543424)
#include <fstream>
#include <vector>
using namespace std;
const int MAX_N = 200002;
const int MOD = 1000000007;
int v[MAX_N], cnt[MAX_N], fact[MAX_N], im[MAX_N];
long long dp[MAX_N];
int comb(int n, int k) {
int ret = (1LL * fact[n] * im[fact[k]]) % MOD;
ret = (1LL * ret * im[fact[n - k]]) % MOD;
return ret;
}
int expo(int a, int b) {
int ret = 1;
while(b) {
if(b % 2) {
ret = (1LL * ret * a) % MOD;
}
a = (1LL * a * a) % MOD;
b /= 2;
}
return ret;
}
int main() {
ifstream f("produse.in");
ofstream g("produse.out");
int n, d;
f >> n >> d;
fact[0] = 1;
for(int i = 1; i < MAX_N; ++i) {
fact[i] = (1LL * fact[i - 1] * i) % MOD;
}
for(int i = 1; i < MAX_N; ++i) {
im[i] = expo(i, MOD - 2);
}
for(int i = 0; i < n; ++i) {
f >> v[i];
++cnt[v[i]];
}
for(int i = 1; i <= d; ++i) {
vector <pair < int, int > > tmp;
int p = 1;
for(int j = 1; j <= cnt[i]; ++j) {
p *= i;
if(p > d) {
break;
}
int c = comb(cnt[i], j);
tmp.push_back(make_pair(p, c));
for(int k = 1; k <= d / p; ++k) {
tmp.push_back(make_pair(k * p, dp[k]));
}
}
for(int j = 0; j < (int) tmp.size(); ++j) {
dp[tmp[j].first] += tmp[j].second;
dp[tmp[j].first] %= MOD;
}
}
int ans = 0;
for(int i = 1; i <= d; ++i) {
ans += dp[i];
ans %= MOD;
}
g << ans << "\n";
f.close();
g.close();
return 0;
}