【JZOJ】6272. 整除 (division)

Description

Time Limits: 3000 ms Memory Limits: 262144 KB

Input

Output

Sample Input

0
1
2 3
2 3

Sample Output

6

Data Constraint

思路

考虑题目中的给出素数两两互质这一性质,思考假如N是一个素数时(即c等于1时怎么做)。
很明显此时N<=1e4,则可以从1枚举到N逐个判断。
如果 X M ≡ X ( m o d N ) X^M\equiv X \pmod{N} XMX(modN),则Ans++;

考虑c!=1时,假如这里有一个解 X t X_t Xt,使得 X t M ≡ X t ( m o d N ) X_t^M\equiv X_t \pmod{N} XtMXt(modN)
对于每个质数 P i P_i Pi(i=1,2…c),假如有个解 X i j X_{ij} Xij使得 X i j M ≡ X i j ( m o d P i ) X_{ij}^M\equiv X_{ij}\pmod{P_i} XijMXij(modPi)
那么对于每个t与每个i,必有一个j使得, X t ≡ X i j ( m o d P i ) X_t\equiv X_{ij}\pmod{P_i} XtXij(modPi)

考虑 P i P_i Pi是互质的,那么对于每一组 X i j X_{ij} Xij(每个 P i P_i Pi贡献一个 X i j X_{ij} Xij出来),
都有唯一的一个 X t X_t Xt使得
{ X t ≡ X 1 j ( m o d P 1 ) X t ≡ X 2 j ( m o d P 2 ) . . . . . . . . . . . . X t ≡ X c j ( m o d P c ) \begin{cases} X_t\equiv X_{1j}\pmod{P_1}\\ X_t\equiv X_{2j}\pmod{P_2}\\ ............\\ X_t\equiv X_{cj}\pmod{P_c} \end{cases} XtX1j(modP1)XtX2j(modP2)............XtXcj(modPc)

原因如下:
N = P 1 ∗ P 2.... ∗ P c N=P1*P2....*Pc N=P1P2....Pc,根据中国剩余定理可得,上面的方程组在[1,N]有且只有1个解,
而对于每个个i, X t   m o d   X i j X_t \bmod Xij XtmodXij的值都是唯一的,即每个 X t X_t Xt唯一对应一组 X i j X_{ij} Xij

X t X_t Xt的个数等于 X i j X_{ij} Xij的组数,即为每个 P i P_i Pi的j值个数相乘。
而对于每个 P i P_i Pi的j值个数就可以用c=1的方法去做了。

不过,这题卡常。
对于每个 P i P_i Pi值,从1~ P i P_i Pi暴枚其合法解数量并判断是一个O(P*log(M))的复杂度。
总计O(TCPlog(M)),最坏情况是2.5e7乘上long long取模的常数,很容易被卡。

考虑对于每个 P i P_i Pi,枚举x值时有两种情况:

若x为一个质数,那么直接暴力快速幂算。O(log(M))

若x不为质数,那么把x拆成a*b的形式使得 x = a ∗ b x=a*b x=ab(a!=1且b!=1)。
那么 x m = a m ∗ b m x^m=a^m*b^m xm=ambm,直接O(1)出解。
(先用线性筛预处理一波,减小常数。)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXC=55;
const int MAXP=10005;
const int MOD=998244353;
const long long ONE=1;
long long Ans;int f[MAXP];
int ID,K,M,C,P[MAXC],poit[MAXP];
int pcnt,prime[MAXP],visp[MAXP];
int quick_Pow(int x,int y,int p){
	if(y==0)return 1;
	if(y==1)return x;
	if(y%2)return (x*quick_Pow((x*x)%p,y/2,p))%p;
	return quick_Pow((x*x)%p,y/2,p);
}
inline void Init(int L){
	visp[0]=visp[1]=1;
	for(int i=2;i<=L;i++){
		if(!visp[i])prime[++pcnt]=i;
		for(int j=1;j<=pcnt&&prime[j]*i<=L;j++){
			visp[i*prime[j]]=1;
			poit[i*prime[j]]=prime[j];
			if(i%prime[j]==0)break;
		}
	}
}
int main(){
	//freopen("read.in","r",stdin);
	//freopen("output.out","w",stdout);
	freopen("division.in","r",stdin);
	freopen("division.out","w",stdout);
	Init(10000);
	scanf("%d%d",&ID,&K);
	while(K--){
		scanf("%d%d",&C,&M);Ans=1;
		for(int i=1;i<=C;i++)
			scanf("%d",&P[i]);
		sort(P+1,P+C+1);
		for(int i=1;i<=C;i++){
			int ret=2;f[1]=1;
			for(int j=2;j<P[i];j++){
				if(!visp[j])f[j]=quick_Pow(j,M,P[i]);
				else f[j]=(f[poit[j]]*f[j/poit[j]])%P[i];
				if((f[j]-j+P[i])%P[i]==0)ret++;
			}
			Ans=(Ans*ret)%MOD;
		}
		printf("%lld\n",Ans);
	}
}
/*
4
1
2 3
3 37

5
1
3 3
7 11 13
*/

后记

网上还有一种更强的思路,能O(TCLog(t))出解,我就不写了。(原因是我菜爆了写不来
https://www.cnblogs.com/zjlcnblogs/p/11299900.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值