这个题作为五级题是不是应该卡一下时间

虚空终端  •  1年前


这题说白了就费马小定理

温习一下两个概念

逆元:找到一个b使得 a×b≡1(mod p)称作b是a模p的逆元

费马小定理:若p为素数,则有a^(p-1)≡1(mod p)

是不是看上去很像?

从费马小定理的式子里面拆出来一个a,我们就能得到a^(p-2)×a≡1(mod p)

现在,我们有了a,p,那就要求出a^(p-2)了

那么,一个基本的代码就出来了

#include<iostream>
using namespace std;
int f(int x,int m,int mod)
{
	int ans=1;
	for(int i=1;i<=m;i++)
	{
		ans*=x;
		ans%=mod;
	}
	return ans;
}
int main()
{
	int a,p;
	cin>>a>>p;
	cout<<f(a,p-2,p);
	return 0;
 } 

但是,这是一道五级题,应该有五级题的格调,那怎样才能最显著的突出难度呢?

三个字母:TLE

但是,这道题如果卡起时间来,那一定是快速幂

所以,这样的代码才有五级题的格调

#include<iostream>
using namespace std;
int f(int x,int m,int mod)
{
	int ans=1;
	while(m)
	{
		if(m&1)
		{
			ans*=x;
			ans%=mod;
		}
		x*=x;
		x%=mod;
		m>>=1;
	}
	return ans;
}
int main()
{
	int a,p;
	cin>>a>>p;
	cout<<f(a,p-2,p);
	return 0;
 } 

所以悄悄的问一句,能不能加点数据量把硬求次方的给卡掉(不然太简单了)

卡时间了撅我~~


评论:

请先登录,才能进行评论