记录编号 463795 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012]集合选数 最终得分 100
用户昵称 Gravatarwumingshi 是否通过 通过
代码语言 C++ 运行时间 0.042 s
提交时间 2017-10-24 19:39:11 内存使用 2.31 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #define N 100005
  4. #define mod 1000000001
  5. int a[1005][500];
  6. int f[2][1000];
  7. bool b[N];
  8. int n,tot,ans=1;
  9. inline void find(int x)
  10. {
  11. tot=0,a[0][0]=1;
  12. for(int i=x;i<=n;i<<=1)
  13. {
  14. tot++,a[tot][0]=0;
  15. for(int j=i;j<=n;j*=3)
  16. a[tot][0]++,b[j]=1;
  17. int top=(1<<a[tot][0]);a[tot][0]=0;
  18. for(int j=0;j<top;j++)
  19. if(!(j&(j>>1))) a[tot][++a[tot][0]]=j;
  20. }
  21. }
  22. inline void dp()
  23. {
  24. memset(f,0,sizeof(f));
  25. f[0][1]=1;
  26. for(int i=1;i<=tot;i++)
  27. {
  28. memset(f[i&1],0,sizeof(f[i&1]));
  29. for(int j=1;j<=a[i-1][0];j++)
  30. for(int k=1;k<=a[i][0];k++)
  31. if(!(a[i-1][j]&a[i][k])) f[i&1][k]=(f[i&1][k]+f[~i&1][j])%mod;
  32. }
  33. }
  34. inline void solve()
  35. {
  36. for(int i=1;i<=n;i++)
  37. if(!b[i])
  38. {
  39. find(i),dp();
  40. int tmp=0;
  41. for(int j=1;j<=a[tot][0];j++)
  42. tmp=(tmp+f[tot&1][j])%mod;
  43. ans=1ll*ans*tmp%mod;
  44. }
  45. }
  46. int main()
  47. {
  48. freopen("bzoj_2734.in","r",stdin);
  49. freopen("bzoj_2734.out","w",stdout);
  50. scanf("%d",&n);
  51. solve();
  52. printf("%d",ans);
  53. return 0;
  54. }