2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数)

J-Product of GCDs

Code1

对于每个质数以及每个质数的次幂单独考虑他们的贡献,由于多次使用快速幂导致TLE

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}int prime[10000010],cnt,is[10000010];
void initP()
{for(int i=2;i<=10000000;i++){if(!is[i]) prime[++cnt]=i;for(int j=1;prime[j]<=10000000/i;j++){is[prime[j]*i]=1;if(i%prime[j]==0) break;}}
}
int n,m;
ll P,Phi;
ll Cphi(ll v)
{ll ans=v;for(int i=1;prime[i]<=v/prime[i];i++)if(v%prime[i]==0){ans=ans/prime[i]*(prime[i]-1);while(v%prime[i]==0) v/=prime[i];}if(v>1) ans=ans/v*(v-1);return ans;
}
const int N=8e4+10;
ll C[N][35];
void mod(ll &v){if(v>=Phi) v-=Phi;}
void initC()
{for(int i=0;i<=n;i++){C[i][0]=1;for(int j=1;j<=min(i,m);j++){C[i][j]=C[i-1][j]+C[i-1][j-1],mod(C[i][j]);}}
}
ll mul(ll a,ll b){return(__int128)a*b%P;}
ll qmi(ll a,ll b)
{ll v=1;while(b){if(b&1) v=mul(v,a);b>>=1;a=mul(a,a);}return v;
}
int a[N];
int main()
{initP();int Tc=rd();while(Tc--){n=rd(),m=rd(),P=rd<ll>(),Phi=Cphi(P);initC();for(int i=1;i<=n;i++) a[i]=rd();ll ans=1;for(int p=1;p<=8000;p++){static int b[N];for(int i=1;i<=n;i++) b[i]=0;for(int i=1;i<=n;i++) while(a[i]%prime[p]==0) a[i]/=prime[p],b[i]++;// 桶排序static int c[30];memset(c,0,sizeof c);int maxn=*max_element(b+1,b+1+n);if(maxn==0) continue;for(int i=1;i<=n;i++) c[b[i]]++;int cnt=0;for(int i=1;i<=maxn;i++) while(c[i]--) b[++cnt]=i;for(int i=1;i<=cnt;i++){ll pw=C[cnt-i][m-1];ans=mul(ans,qmi(qmi(prime[p],pw),b[i]));}}printf("%lld\n",ans);}
}

Code2

考虑分质因子统计,计算f(p,c)f_{(p,c)}f(p,c)表示至少包含 pcp^cpc 的数个数,方案数为
(f(p,c)k)\begin{pmatrix} f_{(p,c)}\\ k \end{pmatrix}(f(p,c)k)

注意需要计算得到的实际上是指数,因此我们需要对于𝜑(𝑷) 取模
(扩展)欧拉定理学习笔记
在这里插入图片描述
好像很多同学关心加不加phi的问题,,我发现欧拉降幂挺多题其实都没故意卡这点也就是记住对𝜑(𝑷)取模即可~

通过分解质因数暴力求𝜑(𝑷)即可,只需要预处理√𝑃 内的质数,复杂度为𝑂(√𝑃+𝑇 √𝑃/(𝑙𝑜𝑔 𝑃))
𝜑(𝑷)不是质数,但是鉴于𝑘较小,组合数直接𝑂(𝑛𝑘)递推即可(为此 𝑛 开得比较小)

#include<bits/stdc++.h>using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res;
}int prime[10000010],cnt,is[10000010];
void initP()
{for(int i=2;i<=10000000;i++){if(!is[i]) prime[++cnt]=i;for(int j=1;prime[j]<=10000000/i;j++){is[prime[j]*i]=1;if(i%prime[j]==0) break;}}
}
int n,m;
ll P,Phi;
ll Cphi(ll v)
{ll ans=v;for(int i=1;prime[i]<=v/prime[i];i++)if(v%prime[i]==0){ans=ans/prime[i]*(prime[i]-1);while(v%prime[i]==0) v/=prime[i];}if(v>1) ans=ans/v*(v-1);return ans;
}
const int N=8e4+10;
ll C[N][35];
void mod(ll &v){if(v>=Phi) v-=Phi;}
void initC()
{for(int i=0;i<=n;i++){C[i][0]=1;for(int j=1;j<=min(i,m);j++){C[i][j]=C[i-1][j]+C[i-1][j-1],mod(C[i][j]);}}
}
ll mul(ll a,ll b){return(__int128)a*b%P;}
ll qmi(ll a,ll b)
{ll v=1;while(b){if(b&1) v=mul(v,a);b>>=1;a=mul(a,a);}return v;
}
int a[N];
int main()
{initP();int Tc=rd();while(Tc--){n=rd(),m=rd(),P=rd<ll>(),Phi=Cphi(P);initC();memset(a,0,sizeof a);for(int i=1;i<=n;i++) a[rd()]++;ll ans=1;for(int p=1;p<=8000;p++){ll res=0;for(int i=prime[p];i<N;i*=prime[p]){int c=0;for(int j=i;j<N;j+=i) c+=a[j];if(c<m) break;res+=C[c][m],mod(res);if(1ll*i*prime[p]>=N) break;}if(res) ans=mul(ans,qmi(prime[p],res));}printf("%lld\n",ans);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AT2390-[AGC016F]Games on DAG【状压dp,SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/AT2390 解题思路 nnn个点的DAGDAGDAG&#xff0c;mmm条边可有可无&#xff0c;111和222上有石头。求有多少种方案使得先手必胜。 1≤n≤15,1≤m≤n(n−1)21\leq n\leq 15,1\leq m\leq \frac{n(n-1)}{2}1≤n≤15,1≤m≤2n(n−1…

牛客题霸 [合并两个有序的数组] C++题解/答案

牛客题霸 [合并两个有序的数组] C题解/答案 题目描述 给出两个有序的整数数组 和 &#xff0c;请将数组 合并到数组 中&#xff0c;变成一个有序的数组 注意&#xff1a; 可以假设 数组有足够的空间存放 数组的元素&#xff0c; 和 中初始的元素数目分别为 和 题目描述 给出…

震惊!快速幂怎么编?省一说暴力,银牌说递归,国集听完笑了

国集&#xff1a;打表啊&#xff01;&#xff01; 题目描述 给你三个整数 b,p,kb,p,kb,p,k&#xff0c;求 bp mod kb^p \bmod kbpmodk。 输入格式 输入只有一行三个整数&#xff0c;分别代表 b,p,kb,p,kb,p,k 输出格式 输出一行一个字符串 b^p mod ks&#xff0c;其中 b,…

CF1392G-Omkar and Pies【dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF1392G 题目大意 两个长度为kkk的起始和目标01串。 nnn个操作交换起始串的两个位置&#xff0c;选择一段长度至少为mmm的连续操作序列使得相同的位数最多。 1≤m≤n≤106,1≤k≤201\leq m\leq n\leq 10^6,1\leq k\leq 201≤…

codeforces1484 B. Restore Modulo(数学)

B. Restore Modulo 忘了当时怎么乱搞的了~ #include<bits/stdc.h>using namespace std; using lllong long;constexpr int N200010;int n; ll a[N],d[N],d0[N]; int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T1;cin>>T;whil…

牛客题霸 [反转字符串] C++题解/答案

牛客题霸 [反转字符串] C题解/答案 题目描述 写出一个程序&#xff0c;接受一个字符串&#xff0c;然后输出该字符串反转后的字符串。&#xff08;字符串长度不超过1000&#xff09; 题解&#xff1a; 有reverse现成的翻转函数&#xff0c;直接套进去就可以 如果不用函数的…

新汉诺塔(洛谷P1242)含第11个数据的解决办法

解析 应该从大到小一个个移&#xff0c;这样后面大盘就可以直接忽略&#xff0c;保证没有冗余操作&#xff0c;必定最优&#xff08;如果先移动小的&#xff0c;后面移动大的时还要动小的&#xff09; 对于第id个从当前位置到目标的移动有两种移动方案&#xff1a; 法1&#x…

让 .Net 更方便的导入导出Excel

Intro因为前一段时间需要处理一些 excel 数据&#xff0c;主要是导入/导出操作&#xff0c;将 Excel 数据转化为对象再用程序进行处理和分析&#xff0c;没有找到比较满意的库&#xff0c;于是就自己造了一个轮子&#xff0c;屏蔽掉了 xlsx 与 xls 的差别&#xff0c;屏蔽了 Np…

P7115-[NOIP2020]移球游戏【构造】

正题 题目链接:https://www.luogu.com.cn/problem/P7115 题目大意 n1n1n1个柱子&#xff0c;前面nnn个上面各有mmm个球&#xff0c;球有nnn种颜色&#xff0c;每种mmm个。 你每次可以把一个柱子最上面的球放到另一个上面&#xff0c;要求在820000820000820000次内使得同种颜色…

2021牛客暑期多校训练营1 I-Increasing Subsequence(期望dp+优化)

I-Increasing Subsequence fi,j,0/1f_{i,j,0/1}fi,j,0/1​表示上一轮第一个人选了iii&#xff0c;第二个人选了jjj&#xff0c;并且当前是第1/2个人选择的概率。 转移考虑枚举k下一步往哪走 fi,k,1∑fi,j,0/cntf_{i,k,1}\sum f_{i,j,0}/ \text{cnt}fi,k,1​∑fi,j,0​/cnt fk,…

牛客题霸 [子数组的最大累加和问题] C++题解/答案

牛客题霸 [子数组的最大累加和问题] C题解/答案 题目描述 给定一个数组arr&#xff0c;返回子数组的最大累加和 例如&#xff0c;arr [1, -2, 3, 5, -2, 6, -1]&#xff0c;所有子数组中&#xff0c;[3, 5, -2, 6]可以累加出最大的和12&#xff0c;所以返回12. [要求] 时间复…

无限序列 (ybtoj C.3)

解析 乍一看很蒙的题 首先&#xff0c;a-b1的个数可以等价于**&#xff08;1-b&#xff09;1的个数减去&#xff08;1-a-1&#xff09;1的个数** 分析之后发现&#xff0c;经过多次变换后&#xff1a; 长度 1的个数 1 1 2 1 3 2 5 3 8 5 … … 又是熟悉的斐波拉契。。。 但是我…

P5644-[PKUWC2018]猎人杀【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P5644 题目大意 nnn个人&#xff0c;每个人被选中的权重是aia_iai​。每次按照权重选择一个没有死掉的人杀死&#xff0c;求第111个人最后死的概率。输出答案对998244353998244353998244353取模。 wi>0,∑i1nwi≤105w_i>…

对传统应用进行容器化改造

本文由 陈计节 翻译自 FP Complete 网站上的文章 CONTAINERIZING A LEGACY APPLICATION: AN OVERVIEW&#xff0c;原作者 Emanuel Borsboom。以下为译文全文&#xff0c;如需阅读英文原文&#xff0c;请转到文末获取链接&#xff1a;本文接下来简要介绍什么是容器化&#xff0c…

2021牛客暑期多校训练营2 L-WeChat Walk(分块)

L-WeChat Walk 每个大点记录一下邻接点的最大步数 每次修改的时候&#xff0c;枚举修改点的邻接的大点来更新 修改大点的时候直接判是不是比邻接点都大 代码抄的std好不容易才看懂~ Code1 #include<bits/stdc.h> using namespace std; template <class Tint> T…

牛客题霸 [求平方根] C++题解/答案

牛客题霸 [求平方根] C题解/答案 题目描述 实现函数 int sqrt(int x). 计算并返回x的平方根 题解&#xff1a; 要求返回平方根&#xff0c;我们就找一个i&#xff0c;使得ii<x&&(i1)(i1)>x 这样的i就是我们要找的答案 注意&#xff0c;x有可能为负数&#xf…

二分算法:平均值(洛谷 UVA1451)

解析 这道题寻找平均值的max&#xff0c;答案明显具有单调性&#xff0c;所以采用二分算法 从0到1不断取中点mid作为平均值的可能点&#xff0c;看是否存在不短于l的数列均值&#xff1e;mid不难得到以下代码&#xff1a; double st0,ed1;for(int i1;i<10;i){double mid(s…

P5287-[HNOI2019]JOJO【KMP】

正题 题目链接:https://www.luogu.com.cn/problem/P5287 题目大意 开始一个空串&#xff0c;nnn个操作 在末尾加入xxx个ccc字符&#xff08;保证和ccc和前面的字符不同&#xff09;返回到第xxx次操作之后 每次操作完成后求所有前缀的最长的borderborderborder长度和 1≤n≤…

牛客题霸 [数组中只出现一次的数字] C++题解/答案

牛客题霸 [数组中只出现一次的数字] C题解/答案 题目描述 一个整型数组里除了两个数字之外&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 题解&#xff1a; 用map来记录每个数字出现几次&#xff0c;然后再循环一遍看哪个数字出现一次&#x…

Asp.NetCore依赖注入和管道方式的异常处理及日志记录

前言在业务系统&#xff0c;异常处理是所有开发人员必须面对的问题&#xff0c;在一定程度上&#xff0c;异常处理的能力反映出开发者对业务的驾驭水平&#xff1b;本章将着重介绍如何在 WebApi 程序中对异常进行捕获&#xff0c;然后利用 Nlog 组件进行记录&#xff1b;同时&a…