Submission #18636

#TimeUsernameProblemLanguageResultExecution timeMemory
18636Namnamseo경비원 (GA8_guard)C++14
29 / 100
267 ms1236 KiB
#include <cstdio> int ps[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; int pn=15; int n; int data[2223]; int mask[2223]; int dp[1<<15]; int overcnt[2223]; int onecnt; int sqn = 47; int M=int(1e9)+7; bool isprime(int x){ for(int i=2;i*i<=x;++i) if(x%i==0) return 0; return 1; } int main() { int i,j; scanf("%d",&n); for(i=0;i<n;++i){ scanf("%d",data+i); if(data[i]==1) ++onecnt; else { if(data[i]>sqn && isprime(data[i])) ++overcnt[data[i]]; else { for(j=0; j<pn; ++j){ if(data[i]%ps[j]==0){ mask[i]|=(1<<j); } } } } } dp[0]=1; for(i=0;i<n;++i){ if(data[i]==1 || overcnt[data[i]]) continue; int cm=mask[i]; for(j=0;j<32768;++j){ if((j&cm)==cm){ dp[j]+=dp[j^cm]; dp[j]%=M; } } } int asdf=1; for(i=sqn+1;i<=2222;++i){ if(overcnt[i]){ asdf=(asdf*1LL*(overcnt[i]+1))%M; } } for(;onecnt--;) asdf=(asdf*2)%M; int fdsa=0; for(i=0;i<32768;++i){ //if(dp[i]) printf("Mask %d : %d\n",i,dp[i]); fdsa=(fdsa+dp[i])%M; } printf("%d\n",int((asdf*1LL*fdsa%M-n-1+M)%M)); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...