传送门

题意

给出n个数,m次访问,每次询问[L,R]的数有多少种排列

分析

\(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一个数,\(区间值*区间长度/该数出现次数\),减去一个数则相反操作讲解

trick

1.我的原先莫队写法不能ac,原因是我传入的L,R是全局变量,在insert和erase前就++,--了,而没有达到预期目的,把R++,L--分离即可

代码

  1. //wa
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define ll long long
  5. #define F(i,a,b) for(int i=a;i<=b;++i)
  6. #define R(i,a,b) for(int i=a;i<b;++i)
  7. #define mem(a,b) memset(a,b,sizeof(a))
  8. const ll mod = 1e9+7;
  9. int t,n,m,len,L,R;
  10. int a[30030],cnt[30030];
  11. ll ans[30030],ret;
  12. struct node
  13. {
  14. int l,r,id,block;
  15. node(){}
  16. node(int l,int r,int id):l(l),r(r),id(id){block=l/len;}
  17. bool operator<(const node &p)const
  18. {
  19. return block==p.block?r<p.r:block<p.block;
  20. }
  21. }e[30030];
  22. ll inv[30030];
  23. void get_inverse(int n, ll p) {
  24. inv[1] = 1;
  25. for (int i = 2; i <= n; ++i) {
  26. inv[i] = (p - p / i) * inv[p % i] % p;
  27. }
  28. }
  29. void insert(int loc)
  30. {
  31. cnt[a[loc]]++;
  32. //printf("l=%d r=%d\n",L,R);
  33. ret=ret*(R-L+1)%mod;
  34. ret=ret*inv[cnt[a[loc]]]%mod;
  35. //printf("ret=%lld\n",ret);
  36. }
  37. void erase(int loc)
  38. {
  39. ret=ret*cnt[a[loc]]%mod;
  40. ret=ret*inv[R-L+1]%mod;
  41. cnt[a[loc]]--;
  42. }
  43. int main()
  44. {
  45. get_inverse(30000,mod);
  46. for(scanf("%d",&t);t--;)
  47. {
  48. scanf("%d %d",&n,&m);
  49. F(i,1,n) scanf("%d",a+i);
  50. len=sqrt(n);
  51. F(i,1,m)
  52. {
  53. int left,right;
  54. scanf("%d %d",&left,&right);
  55. e[i]=node(left,right,i);
  56. }
  57. sort(e+1,e+1+m);
  58. L=1,R=0;
  59. ret=1;
  60. mem(ans,0);mem(cnt,0);
  61. //F(i,1,n) printf("%lld%c",inv[i],i==n?'\n':' ');
  62. F(i,1,m)
  63. {
  64. //printf("ret1=%lld\n",ret);
  65. while(R<e[i].r) insert(++R);
  66. while(L>e[i].l) insert(--L);
  67. while(R>e[i].r) erase(R--);
  68. while(L<e[i].l) erase(L++);
  69. ans[e[i].id]=ret;
  70. //printf("ret2=%lld\n",ret);
  71. }
  72. F(i,1,m) printf("%lld\n",ans[i]);
  73. }
  74. return 0;
  75. }
  1. //ac
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define ll long long
  5. #define F(i,a,b) for(int i=a;i<=b;++i)
  6. #define R(i,a,b) for(int i=a;i<b;++i)
  7. #define mem(a,b) memset(a,b,sizeof(a))
  8. const ll mod = 1000000007;
  9. int t,n,m,len,L,R;
  10. int a[30030],cnt[30030];
  11. ll ans[30030],inv[30030];
  12. ll ret;
  13. struct node
  14. {
  15. int l,r,id,block;
  16. node(){}
  17. node(int _l,int _r,int _id):l(_l),r(_r),id(_id){block=l/len;}
  18. bool operator<(const node &p)const
  19. {
  20. return block==p.block?r<p.r:block<p.block;
  21. }
  22. }e[30030];
  23. ll pow_mod(ll a,ll p)
  24. {
  25. ll ans=1;
  26. for(ll ret=a;p;p>>=1,ret=ret*ret%mod) if(p&1) ans=ans*ret%mod;
  27. return ans%mod;
  28. }
  29. void insert(int loc)
  30. {
  31. cnt[a[loc]]++;
  32. //printf("l=%d r=%d\n",L,R);
  33. ret=ret*(R-L+1)%mod;
  34. ret=ret*inv[cnt[a[loc]]]%mod;
  35. //printf("ret=%lld\n",ret);
  36. }
  37. void erase(int loc)
  38. {
  39. ret=ret*cnt[a[loc]]%mod;
  40. ret=ret*inv[R-L+1]%mod;
  41. cnt[a[loc]]--;
  42. }
  43. int main()
  44. {
  45. F(i,1,30000) inv[i]=pow_mod(i,mod-2);
  46. for(scanf("%d",&t);t--;)
  47. {
  48. scanf("%d %d",&n,&m);
  49. F(i,1,n) scanf("%d",a+i);
  50. len=sqrt(n);
  51. F(i,1,m)
  52. {
  53. int left,right;
  54. scanf("%d %d",&left,&right);
  55. e[i]=node(left,right,i);
  56. }
  57. sort(e+1,e+1+m);
  58. ret=1;
  59. mem(ans,0);mem(cnt,0);
  60. L=1;R=0;
  61. //F(i,1,n) printf("%lld%c",inv[i],i==n?'\n':' ');
  62. F(i,1,m)
  63. {
  64. //printf("ret1=%lld\n",ret);
  65. while(R<e[i].r) {++R;insert(R);}
  66. while(L>e[i].l) {--L;insert(L);}
  67. while(R>e[i].r) {erase(R);R--;}
  68. while(L<e[i].l) {erase(L);L++;}
  69. ans[e[i].id]=ret;
  70. //printf("ret2=%lld\n",ret);
  71. }
  72. F(i,1,m) printf("%lld\n",ans[i]);
  73. }
  74. return 0;
  75. }

HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)的更多相关文章

  1. HDU 5145 NPY and girls 莫队+逆元

    NPY and girls Problem Description NPY's girlfriend blew him out!His honey doesn't love him any more! ...

  2. NPY and girls-HDU5145莫队算法

    Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

  3. hdu_5145_NPY and girls(莫队算法+组合)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5145 题意:给你n,m,共有n个女孩,标号为1—n,n个数xi表示第ith个女孩在第xi个教室,然后下 ...

  4. HDU 5145 - NPY and girls

    题意: cases T(1≤T≤10) (0<n,m≤30000) (0<ai≤30000)    n个数ai 表示n个女孩所在教室 m次询问 [L,R](1 <= L <= ...

  5. HDU 5145 NPY and girls(莫队算法+乘法逆元)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5145 [题目大意] 给出一个数列,每次求一个区间数字的非重排列数量.答案对1e9+7取模. [题解 ...

  6. hdu 5145(莫队算法+逆元)

    NPY and girls Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. NBUT 1457 莫队算法 离散化

    Sona Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format: Submit Status Practice NBUT 145 ...

  8. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  9. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

随机推荐

  1. fuel 安装openstack

  2. 走入asp.net mvc不归路:[3]创建控制器

    实际上,控制器就是一个类,一个继承自Controller的类.正常创建一个Controller即可,而问题在于asp.net mvc提供了一套便捷的方法,在创建一个Controller时,可以自动创建 ...

  3. ORA-07445 第一參数为:kkqljpmpr

      在版本号11.2.0.1.0上,在pl/sql developer中运行一条SQL会导致连接中断,这样的错误要到trace文件夹下找到错误日志文件,再定位.查了一下资料,是这个版本号的bug. D ...

  4. UUID GUID

    http://baike.baidu.com/link?url=xkck9gR5bzOx0oBKP1qNJwGGq3IO56V4i8cg9zTSpSDMVBMA0F7jr0AdkQTGyk7F0FGj ...

  5. HDU 1248 寒冰王座 (水题的N种做法!)(含完全背包)

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. php 0、null、empty和false之间的关系

    // 判断 0 与 ''.null.empty.false 之间的关系 $a = 0; echo "0 与 ''. empty.null.false 之间的关系:"; if($a ...

  7. 项目Beta冲刺(团队6/7)

    项目Beta冲刺(团队6/7) 团队名称: 云打印 作业要求: 项目Beta冲刺(团队) 作业目标: 完成项目Beta版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 陈宇 ...

  8. (转载)js(jquery)的on绑定点击事件执行两次的解决办法

    js(jquery)的on绑定点击事件执行两次的解决办法—不是事件绑定而是事件冒泡 遇到的问题:jquery中用.on()给页面中新加的元素添加点击事件时,点击事件源,绑定的事件执行两次,这里的ale ...

  9. vc6.0的一些快捷键

    1.检测程序中的括号是否匹配    把光标移动到需要检测的括号(如大括号{}.方括号[].圆括号()和尖括号<>)前面,键入快捷键“Ctrl+]”.如果括号匹配正确,光标就跳到匹配的括号处 ...

  10. import data from excel to sql server

    https://www.c-sharpcorner.com/article/how-to-import-excel-data-in-sql-server-2014/ 需要注意的是,第一次是选择sour ...