洛谷P10515 转圈题解

Link

思路

假设目前我们所在的位置是 x x x,那么走一步之后的位置就是 x + x × m = x × ( m + 1 ) x+x\times m=x \times (m+1) x+x×m=x×(m+1),即每走一步我们所在的位置编号就会乘上 ( m + 1 ) (m+1) (m+1)。

于是题意被转化为求最小的正整数 a a a 使得 (m+1)\^a \\equiv 1 \\pmod{n} 。

由于 n n n 是质数,根据费马小定理, ( m + 1 ) n − 1 ≡ 1 ( m o d n ) (m+1)^{n-1} \equiv 1 \pmod{n} (m+1)n−1≡1(modn),于是有 a ∣ n − 1 a|n-1 a∣n−1。我们可以先对 n − 1 n-1 n−1 进行质因数分解,设 n o w now now 初始值为 n − 1 n-1 n−1,我们枚举每一个质因数 x x x,如果 (m+1)\^\\frac{now}{x} \\equiv 1 \\pmod{n} ,我们就令 n o w = n o w x now=\frac{now}{x} now=xnow,即试除,最后 n o w now now 的值就是答案。

这里有一个小技巧,直接分解质因数是时间复杂度 O ( n ) O(\sqrt n) O(n ) 的,但是由于这个题目中 n n n 比较小,我们可以先跑一遍线性筛求出每个数的最小质因子,这样复杂度就是 O ( log ⁡ n ) O(\log n) O(logn) 的了。

代码

时间复杂度 O ( T n log ⁡ 2 n ) O(Tn \log^2 n) O(Tnlog2n)(试除过程中需要用到快速幂)。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int t,n,m,shai[10000005],u[10000005],cnt=0;
bool bj[10000005];
int ksm(int x,int y)
{
	int now=x,op=1;
	for(int i=0;(1<<i)<=y;i++)
	{
		if((1<<i)&y) op=1ll*op*now%n;
		now=1ll*now*now%n;
	}
	return op;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	for(int i=2;i<=1e7;i++)
	{
		if(!bj[i]) u[++cnt]=i,shai[i]=1;
		for(int j=1;j<=cnt&&u[j]*1ll*i<=1e7;j++)
		{
			bj[u[j]*i]=1,shai[u[j]*i]=u[j];
			if(i%u[j]==0) break;
		}
	}
	cin>>t;		
	while(t--)
	{
		cin>>n>>m;
		if(m+1==n)
		{
			cout<<"2\n";
			continue ;
		}
		int now=n-1;
		vector<int> q;
		while(now)
		{
			int y=shai[now];
			if(y==1) break;
			q.push_back(y),now/=y;
		}
		q.push_back(now),now=n-1;
		for(int i=0;i<q.size();i++)
		{
			int u=now/q[i];
			if(ksm(m+1,u)==1) now=u;
		}
		cout<<now<<"\n";
	}
	return 0;
} 
相关推荐
labuladong1 小时前
机器学习&神经网络 系列教程上线
神经网络·算法·机器学习
xiangyun611 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
学习论之费曼学习法1 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然1 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
SunkingYang1 小时前
C++14 vs C++17:新特性对比与用法指南
c++·新特性·用法·c++14·示例·c++17
w_zero_one1 小时前
算法--桶思想
java·开发语言·算法
wordbaby2 小时前
同一次请求里的两道锁:图解搞懂国密 SM2 与 SM3
算法
SunkingYang2 小时前
C++ Lambda 表达式原理详解
c++·lambda·理论·原理·表达式
xiaoye-duck3 小时前
《C++ 工具库实战》GTest 单元测试:断言、全局环境、局部夹具与底层原理
c++·单元测试·第三方库
学逆向的3 小时前
C++ 匿名命名空间
开发语言·c++·网络安全