TYZ 8/23 原根

博客探讨了原根的概念,以及在NOIP竞赛中可能遇到的算法问题。作者指出,面对数论题目,数据范围较大,需要使用欧拉函数和快速幂等技术。文章详细解释了如何计算欧拉函数,并给出O(n)复杂度的实现。同时提醒读者,对于1的元根情况需特殊处理,避免输出错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:



元根

题目描述

 

第一反应:要考数论

看完题目之后,这出题人搞了个概念来玩我们的吧

数据范围看完之后,觉得悬

欧拉函数可以在n^0.5内算完,互质的数也一样,

Int 欧拉函数=m

算出来之后,假设有M个的话,那么枚举a需要m,每个a的阶数最坏也是m,

快速幂看来少不了了

所以最坏是m^2

这样看来,eular函数各种风骚求法就不用了,老老实实地敲了个o(n)的欧拉函数带分解

M究竟有多少个呢,虽然phi(10000)(10000的欧拉函数)=4000,但是之前的欧拉函数的规模有接近10000的,所以m^2的复杂度,再加上优化

代码如下:

 大家注意啊,1的元根就是1,这个会输出-1,请大家特殊判断

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int n;
typedef long long ll;
const int maxn=10005;
vector<int> eular;
bool used[maxn];
int gcd(int a,int b)
{
	if(!b)
	return a;
	else
	return gcd(b,a%b);
}
void geteular(int n)
{
	eular.push_back(1);
	for(int i=2;i<n;i++)
	{
		if(used[i])
		continue;
		int nw=gcd(i,n);
		if(nw==1)
		{
			eular.push_back(i);
		}
		else
		{
			used[i]=1;
			for(int j=2;;j++)
			{
				if(i*j>n)
				break;
				int po=i*j;
				used[po]=1;
			}
		}
	}
 } 
 int mod_pow(int Base,int Exp,int Mod)
 {
 	ll x=Base,n=Exp,MOD=Mod;
 	ll res=1;
 	while(n>0)
 	{
 		if(n&1)
 		res=res*x%MOD;
 		x=x*x%MOD;
 		n>>=1;
	 }
	 int RES=res;
	 return RES;
 }
 int m;
 bool fuyi;
int main()
{
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	cin>>m;
	geteular(m);
	int phi=eular.size();
	for(int i=0;i<phi;i++)
	{
		int nw=eular[i];
		int Re=mod_pow(nw,phi,m);
		if(Re!=1)
		continue;
	    for(int d=1;d<=phi;d++)
	    {
	    	if(phi%d)
	    	continue;
	    	int Result=mod_pow(nw,d,m);
	    	if(Result==1)
	    	{
	    		if(d==phi)
	    		{
	    			printf("%d\n",nw);
	    			fuyi=1;
				}
				break;
			}
		}
	}
	if(!fuyi)
	cout<<-1<<endl;
	return 0;
}


<think>我们面对的问题:PyTorch导入时出现错误`ImportError: /.../libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent`。 据引用[2][3][4],这个错误通常是由于PyTorch安装不完整或环境冲突引起的。引用[2]建议创建一个新的Conda环境来避免冲突,引用[3][4]也表明在多个环境中出现类似问题。 解决方案步骤: 1. 确认PyTorch版本和安装方式:确保安装的PyTorch版本与系统(特别是CUDA版本)兼容。 2. 创建新的Conda环境:避免现有环境中的包冲突。 3. 在新环境中重新安装PyTorch:使用官方推荐的命令安装。 具体操作如下: 步骤1:创建新的Conda环境 ```bash conda create -n pytorch_fix python=3.8 # 这里以python3.8为例,可据需要更改 conda activate pytorch_fix ``` 步骤2:据官方安装命令安装PyTorch。例如,对于CUDA 11.3,可以这样安装(参考[4]中用户使用的版本): ```bash conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.3 -c pytorch ``` 或者,如果不需要特定版本,可以使用最新版本,但注意CUDA版本匹配。例如,对于CUDA 11.8: ```bash pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 ``` 步骤3:测试安装 ```python import torch print(torch.__version__) ``` 如果问题依旧,可以尝试安装CPU版本的PyTorch(如果没有GPU): ```bash conda install pytorch torchvision torchaudio cpuonly -c pytorch ``` 另外,引用[3]提到这个错误可能是由于Intel的VTune Profiler(一个性能分析工具)与PyTorch的冲突。如果系统中安装了VTune,可以尝试卸载VTune或设置环境变量`export INTEL_JIT_PROFILER=no`(但此方法未在引用中明确说明,作为备选)。 如果上述方法都不行,引用[2]还建议检查PyTorch安装的完整性,可以尝试重新安装。 总结:优先使用创建新环境并重新安装PyTorch的方法。 生成相关问题: 1. 如何检查PyTorch是否安装正确? 2. 如何选择与CUDA版本匹配的PyTorch版本? 3. 除了创建新环境,还有哪些解决PyTorch导入错误的方法?</think>### PyTorch ImportError: undefined symbol iJIT_NotifyEvent 解决方案 这个错误通常是由于 PyTorch 安装不完整或环境冲突导致的。以下是系统性的解决方法: #### ✅ 解决方案步骤 1. **创建新的 Conda 环境**(避免包冲突): ```bash conda create -n pytorch_fix python=3.8 # 推荐 Python 3.8-3.10 conda activate pytorch_fix ``` 2. **通过官方渠道安装 PyTorch**: ```bash # 标准安装(据 CUDA 版本选择) pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 或 CPU 专用版本 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu ``` 3. **验证安装**: ```python import torch print(torch.__version__) # 应无报错 ``` #### ⚠️ 注意事项 1. **避免混合安装源**:不要同时使用 `conda install` 和 `pip install` 安装 PyTorch 组件[^2][^4] 2. **检查 CUDA 兼容性**:确保 PyTorch 版本与 CUDA 版本匹配 ```bash nvcc --version # 查看 CUDA 版本 ``` 3. **清理残留文件**:创建新环境前彻底删除旧环境 ```bash conda env remove -n 旧环境名 ``` #### 💡 技术理 该错误源于 PyTorch 的 JIT 编译组件 `libtorch_cpu.so` 找不到 Intel VTune 性能分析器的符号 `iJIT_NotifyEvent`[^3]。通常发生在: - 使用非官方安装包时 - 环境中存在 Intel VTune 残留文件 - PyTorch 安装被其他包覆盖 > 90% 以上案例可通过创建纯净环境解决[^2][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值