Cod sursa(job #1543424)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 6 decembrie 2015 10:55:21
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#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;
}