容斥+gcd+欧拉函数

求出1-n 和 1-m所有gcd(i,j)==x对数

x的范围1-min(n,m)

分解x的质因子 (1-1/p)...

q[x]=(1-1/p1)*(1-1/p2)/...

p是x的质因子

ans=sigma(q[x]*gcd(i,j)==x的对数) 1<=x<=min(n,m)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int phi[maxn],vis[maxn],pre[maxn],top;
ll num[maxn],q[maxn];
ll f[maxn],g[maxn];
ll qpow(ll a,ll b,ll c)
{ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c;b>>=1;}return ans;
}
void init()
{int i,j;for(i=1; i<maxn; i++)phi[i]=i;for(i=2; i<maxn; i+=2)phi[i]/=2;for(i=3; i<maxn; i+=2)if(phi[i]==i){for(j=i; j<maxn; j+=i)phi[j]=phi[j]/i*(i-1);}top=0;memset(vis,0,sizeof(vis));for(i=2; i<maxn; i++){if(!vis[i]){pre[top++]=i;}for(j=0; pre[j]*i<maxn; j++){vis[pre[j]*i]=1;if(i%pre[j]==0)break;}}
}
void init1(ll p)
{int i,j,k;for(i=0; i<top; i++){k=pre[i];q[k]=qpow(pre[i]-1,p-2,p);q[k]=1ll*q[k]*(pre[i])%p;}for(i=1; i<maxn; i++)num[i]=1;for(i=0;i<top;i++){for(j=pre[i];j<maxn;j+=pre[i])num[j]=1ll*num[j]*q[pre[i]]%p;}
}
int main()
{int i,j,k,t,n,m,z;ll ans,p;scanf("%d",&t);init();while(t--){scanf("%d%d%I64d",&m,&n,&p);init1(p);memset(f,0,sizeof(f));memset(g,0,sizeof(g));z=min(n,m);for(i=1; i<=z; i++)f[i]=1ll*(n/i)*(m/i)%p;ll sum;for(i=z; i>=1; i--){sum=0;for(j=i+i; j<=z; j+=i){sum+=g[j];sum=sum%p;}g[i]=(f[i]-sum+p)%p;}ans=0;for(i=1; i<=z; i++){ans+=1ll*g[i]*num[i]%p;ans=ans%p;}printf("%I64d\n",ans%p);}return 0;
}

转载于:https://www.cnblogs.com/liweiggg/p/9475286.html

hdu 多校数论 GuGuFishtion相关推荐

  1. 权值线段树小结(hdu多校,普通平衡树,郁闷的出纳员)

    之前刷了一点主席树的题目,但是没有系统的做过权值线段树的题目.主席树是多根权值线段树的综合.权值线段树可以解决在总区间里求第k大的问题.在普通的线段树里,我们每一个节点维护的是权值大小.但是在权值线段 ...

  2. HDU 多校 6400 Parentheses Matrix(构造)

    HDU 多校 6400 Parentheses Matrix(构造) // Problem: D. Parentheses Matrix // Contest: Codeforces - 2018 C ...

  3. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  4. HDU多校4 - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?!(单调栈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问给出一个区间 [l,r][l,r][l,r],要求输出区间 [l,r][l,r][l,r] 内 " ...

  5. HDU多校4 - 6992 Lawn of the Dead(线段树+模拟)

    题目链接:点击查看 题目大意:给出一个 n∗mn*mn∗m 的矩阵,有 kkk 个点被 banbanban 掉了,现在从点 (1,1)(1,1)(1,1) 出发,只能向右或向下移动,问可以到达的点有多 ...

  6. HDU多校1 - 6959 zoto(莫队+树状数组/值域分块)

    题目链接:点击查看 题目大意:在二维平面内有 nnn 个点,表示为 (i,f[i])(i,f[i])(i,f[i]),需要回答 mmm 次询问,每次询问会给出一个矩形,问矩形内有多少个不同的 yyy ...

  7. HDU多校3 - 6975 Forgiving Matching(多项式匹配字符串)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt.规定 kkk 匹配的意思是,两个长度相同的字符串至多有 kkk 个位置是不同的,特别的, ...

  8. HDU多校1 - 6955 Xor sum(字典树+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,要求找到一段长度最短的区间,使得异或和大于等于 kkk,如果有多种答案,输出左端点最小的那个 题目分析:倒着维护一下后缀异或和,将后缀异或 ...

  9. hdu 4279Number(数论)

    传送门 参考资料: [1]:https://www.2cto.com/kf/201308/233613.html 题意,题解在上述参考资料中已经介绍的非常详细了,接下来的内容只是记录一下我的理解: 我 ...

最新文章

  1. 一分钟详解VS中快速生成dll和lib方法
  2. 团队-象棋游戏-模块开发过程
  3. EasyHook远程代码注入
  4. 来来来,送开发板了。
  5. java写入carbondata_Carbondata使用过程中遇到的几个问题及解决办法
  6. linux系统nginx启动不了,nginx启动不了,求大神帮助!
  7. NOIP2017普及组-1. 成绩
  8. python两数相加取_两数相加(Python3)
  9. 移动端textarea无法滚动
  10. php 如何开发oa系统,如何开发oa系统
  11. 软件项目的规模、工作量和成本是如何进行估算或评估的?
  12. css 文字颜色渐变上到下,CSS 实现背景色渐变和文字颜色渐变
  13. 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?电脑添加双系统启动菜单的方法...
  14. ArcToolbox工具名英汉对应
  15. MiniCMS - 吐槽
  16. 车路协同边缘计算与边云协同概览
  17. 2021-05-08
  18. 【C++要笑着学】关键字 | 命名空间 | 输入和输出
  19. 人人车否认破产称地方经营型模式升级为合伙人模式
  20. 用Python端对端数据分析识别机器人“僵尸粉”

热门文章

  1. linux pwm 调屏_基于嵌入式Linux的LCD背光调节及驱动的实现
  2. Android之给图片添加涂鸦(文字)
  3. KafkaProducer初始化时,是否会拉取集群元数据?
  4. iOS架构-制作属于自己的cocoapods以及podspec文件讲解(20)
  5. ajax+php+jq+面向对象,php+jquery+ajax+json的一个最简单实例
  6. mysql去除字符串首的非字母_如何从SQLServer中的字符串中删除所有非字母字符?...
  7. 麦子学院彭亮python基础_麦子学院python
  8. mysql导入导出数据库
  9. exist not exist 分析
  10. Linux中source命令的用法