#include <bits/stdc++.h> using namespace std; const int mod=1000000007; int tab[5001]; long long silnia[5001], odw[5001], ile[25000001], odp; set<int>zbior; vector<int>pchaj; int main() { silnia[0]=1; odw[5000]=387029115; for (int i=1; i<5001; i++) { silnia[i]=silnia[i-1]*i; silnia[i]%=mod; } for (int i=5000; i>0; i--) { odw[i-1]=odw[i]*i; odw[i-1]%=mod; } // cout<<silnia[1]<<" "<<odw[1]<<"\n"; ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin>>n; for (int i=0; i<n; i++) { int a; cin>>a; tab[a]++; } zbior.insert(0); set<int>::iterator ir; ile[0]=1; for (int i=1; i<5001; i++) { if (!tab[i]) continue; ir=prev(zbior.end()); while ((*ir)>=i-1) { for (int j=1; j<=tab[i]; j++) { long long pom=(silnia[tab[i]]*odw[j])%mod; pom*=odw[tab[i]-j]; pom%=mod; if (ile[(*ir)+j*i]==0) { pchaj.push_back((*ir)+j*i); // cout<<"TEST "<<(*ir)+j*i<<endl; } // cout<<"POM "<<pom<<endl; ile[(*ir)+j*i]+=ile[(*ir)]*pom; ile[(*ir)+j*i]%=mod; odp+=ile[(*ir)]*pom; odp%=mod; } if (ir==zbior.begin()) break; ir=prev(ir); } for (int j=0; j<pchaj.size(); j++) zbior.insert(pchaj[j]); pchaj.clear(); } cout<<odp; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <bits/stdc++.h> using namespace std; const int mod=1000000007; int tab[5001]; long long silnia[5001], odw[5001], ile[25000001], odp; set<int>zbior; vector<int>pchaj; int main() { silnia[0]=1; odw[5000]=387029115; for (int i=1; i<5001; i++) { silnia[i]=silnia[i-1]*i; silnia[i]%=mod; } for (int i=5000; i>0; i--) { odw[i-1]=odw[i]*i; odw[i-1]%=mod; } // cout<<silnia[1]<<" "<<odw[1]<<"\n"; ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin>>n; for (int i=0; i<n; i++) { int a; cin>>a; tab[a]++; } zbior.insert(0); set<int>::iterator ir; ile[0]=1; for (int i=1; i<5001; i++) { if (!tab[i]) continue; ir=prev(zbior.end()); while ((*ir)>=i-1) { for (int j=1; j<=tab[i]; j++) { long long pom=(silnia[tab[i]]*odw[j])%mod; pom*=odw[tab[i]-j]; pom%=mod; if (ile[(*ir)+j*i]==0) { pchaj.push_back((*ir)+j*i); // cout<<"TEST "<<(*ir)+j*i<<endl; } // cout<<"POM "<<pom<<endl; ile[(*ir)+j*i]+=ile[(*ir)]*pom; ile[(*ir)+j*i]%=mod; odp+=ile[(*ir)]*pom; odp%=mod; } if (ir==zbior.begin()) break; ir=prev(ir); } for (int j=0; j<pchaj.size(); j++) zbior.insert(pchaj[j]); pchaj.clear(); } cout<<odp; return 0; } |