fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int MOD =(int)1e9+7;
  5.  
  6. long long modpow(long long a,long long e = MOD - 2) {
  7. long long r = 1;
  8. while (e) {
  9. if (e & 1) r = r*a%MOD;
  10. a = a*a % MOD;
  11. e >>= 1;
  12. }
  13. return r;
  14. }
  15.  
  16. int main() {
  17. int N;
  18. if (!(cin >> N))
  19. return 0;
  20.  
  21. vector<int> A(N);
  22. int maxA = 0;
  23. for (int i = 0;i<N;i++)
  24. { cin >> A[i];
  25. maxA = max(maxA,A[i]);
  26. }
  27.  
  28. vector<int> freq(maxA+1,0);
  29. for (int x:A) freq[x]++;
  30.  
  31. vector<int> is_composite(maxA+1,0), primes;
  32. for (int i =2;i*i<=maxA;i++) {
  33. if (is_composite[i] == 0) {
  34. for (int j = i*i; j<=maxA; j+=i)
  35. is_composite[j] = 1;
  36. }
  37. }
  38. for (int i =2;i<= maxA;i++)
  39. if (is_composite[i] == 0)
  40. primes.push_back(i);
  41.  
  42. vector<int> cnt = freq;
  43. for (int p:primes)
  44. for (int i =1;i<=maxA/p;i++)
  45. cnt[i] += cnt[i*p];
  46.  
  47. vector<long long> fact(N+1,1),invfact(N+1,1);
  48. for (int i = 1; i <= N; i++)
  49. fact[i] = fact[i - 1]*i%MOD;
  50. invfact[N] = modpow(fact[N]);
  51. for (int i = N; i >= 1; i--)
  52. invfact[i - 1] = invfact[i]*i%MOD;
  53. auto C = [&](int n, int k)->long long{
  54. if (k < 0 || k > n) return 0;
  55. return fact[n]*invfact[k]%MOD*invfact[n - k]%MOD;
  56. };
  57.  
  58. int Q;
  59. cin>>Q;
  60. struct Query {int g,idx;};
  61. unordered_map<int, vector<Query>> bucket;
  62. bucket.reserve(Q*2);
  63. vector<long long> answer(Q);
  64.  
  65. for (int i =0;i<Q;i++) {
  66. int k,g;
  67. cin>>k>> g;
  68. bucket[k].push_back({g, i});
  69. }
  70.  
  71. vector<long long> S(maxA + 1), E(maxA + 1);
  72.  
  73. for (auto &entry :bucket) {
  74. int k = entry.first;
  75. auto &qs = entry.second;
  76. for (int d =1;d <= maxA;d++)
  77. S[d] = C(cnt[d], k);
  78. E = S;
  79. for (int p:primes)
  80. for (int i =1;i<= maxA/p;i++) {
  81. E[i]-= E[i * p];
  82. if (E[i]<0) E[i]+=MOD;
  83. }
  84. for (int d=1;d<=maxA;d++) {
  85. E[d]%=MOD;
  86. if (E[d]<0)
  87. E[d]+=MOD;
  88. }
  89. for (auto &q:qs) {
  90. int g =q.g;
  91. answer[q.idx] = (g<=maxA?E[g]:0);
  92. }
  93. }
  94.  
  95. for (int i=0;i<Q;i++)
  96. cout <<answer[i]%MOD<< '\n';
  97. return 0;
  98. }
  99.  
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
Standard output is empty