hdu 5392 许多数的lcm的取模

算出每个循环块的长度,直接相乘肯定是不行的,需要分解质因数,每个因子取每次分解出来数量的最大值,然后用下快速幂优化下乘法就好了,比赛时脑子短路了,一直wa

#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=3e6+10;
const long long MOD=3221225473;
int n;
int a[N];
bool vis[N];
int b[N],ma;
long long res=1;
void rd(int&x){
	char ch;
	for(ch=getchar();ch<'0' || ch>'9';ch=getchar());
	x=0;
	for(;ch>='0' && ch<='9';ch=getchar()) x=x*10+ch-'0';
}
long long solve(long long x,long long y){
	long long res=1;
	while(y){
		if(y&1) res=(res*x)%MOD;
		x=(x*x)%MOD;
		y>>=1;
	}
	return res;
}
int main(){
#ifndef ONLINE_JUDGE
	freopen("aaa","r",stdin);
#endif 
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);	
		ma=-1;
		for(int i=1;i<=n;i++){ rd(a[i]);ma=max(ma,a[i]);}
		memset(vis,0,sizeof vis);	
		memset(b,0,sizeof b);
		bool find=false;
		for(int i=1;i<=n;i++){
			if(vis[i] || a[i]==i) continue;
			int j=i,cnt=0;
			find=true;
			while(!vis[j]){cnt++;vis[j]=true;j=a[j];}
			int tmp=cnt;
			for(int i=2;i*i<=tmp;i++){
				if(cnt%i==0){int num=0;while(cnt%i==0){cnt/=i;num++;}b[i]=max(b[i],num);}
				if(cnt==1) break;
			}
			if(cnt>1) b[cnt]=max(b[cnt],1);
		}
		res=1;
		if(!find){puts("0");continue;}
		for(int i=2;i<=ma;i++) if(b[i])res=(res*solve(i,b[i]))%MOD;
		cout<<res<<endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1。打开功能是专门用于对C语言文件自动提取显示所需要的汉字,进行点阵码据转换的, 在您的C语言程序中,有一点需要特别留意:您的注解中请不要使用双引号,否则会引起 提取错误。 软件包中的文件ee.c作为一个简单例程供提取测试用。 2。提取以后的点阵码可以随意修改点阵据,使用鼠标的左键为加一点,右键为擦除一点。 修改完毕请按旁边的确认键将据记录到点阵码中,否则您的修改将自动放弃。 3。点阵码可以随意平移,请谨慎使用。平移之前请查看一遍所有的字符点阵图,平移有可能 会丢失边界点,移出了边界的点阵将被丢弃,不可恢复。 平移前请确认是否有必要进行全体字符一起移动。 4。用户自定义特殊字符的建立,首先选定点阵据,在下面的汉字输入窗口输入几个您不使 用的汉字,确认。然后生成了这些汉字的点阵码,再将他们清空(使用平移按钮中间的那 块抹布),就可以用鼠标描绘你的图案了,最后别忘了打“确认”键。 5。ASCII字符可以自动提取0x20~0x7f的全部,最后一个0x7f一般都没有用,可以手工将它删 除,也可以利用它做一个简单的特殊字符。 汉字库中也包含有ascii字符,但是经查对与这三个ascii库基本一样,所以就不再重复。 6。保存文件:C语言格式的默认为.h类型,汇编格式的默认为.inc类型,只要将他们加入到 您的工程中就可以了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值