欧拉降幂问题

题目连接

        D-幂运算_2023河南萌新联赛第(四)场:河南大学 (nowcoder.com)

        djz的数学题 (nowcoder.com)

 

欧拉降幂

当 b 过大时,快速幂的时间复杂度超过题目要求时,考虑欧拉降幂。 

 

 §(c)是 欧拉函数 里求小于他的跟他互质的数的个数

伪代码

long long oula(long long b)
{
	long long ans=b;
	for(int i=2;i*i<=b;i++)
	{
		if(b%i==0)
		{
			ans=ans/i*(i-1);
			while(b%i==0) b/=i;
		}
	}
	
	if(b>1) ans=ans/b*(b-1);
	return ans;
}

求出后套板子即可。

看不懂板子看下面代码该如何操作就行拉

题-F-数学题

 这题通过手磨,拆两次括号可以得到,

原式=1+x^1+x^2+x^3+x^4……x^(2*2^n-1).

也就是求首相为1,公比为x的前2^(n+1)项和。

这个题目的余数为 998244353 是个质数,可以求出他的 oula 值为 998244352

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=998244353;
ll ksm(ll a,ll x,ll mod)
{
	ll cnt=1;
	while(x)
	{
		if(x%2)	cnt=cnt*a%mod;
		a=a*a%mod;
		x/=2;
	}
	return cnt;
}

int main()
{
	ll n,x;
	cin>>n>>x;
	x%=M;
	if(x==1)	cout<<ksm(2,n+1,M);
	else
	{
		ll q=ksm(2,n+1,M-1);
		q=(ksm(x,q,M)-1+M)%M;
		ll p=ksm(x-1,M-2,M);
		cout<<(p*q%M+M)%M;
	}
	return 0;
}

题-D-幂运算

 题目的mod需要输入,我们先求出其oula值,在套公式

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,p;
long long oula(long long b)
{
	long long int ans=b;
	for(int i=2;i*i<=b;i++)
	{
		if(b%i==0)
		{
			ans=ans/i*(i-1);
			while(b%i==0) b/=i;
		}
	}
	
	if(b>1) ans=ans/b*(b-1);
	return ans;
}
ll ksm(ll a,ll x,ll mod)
{
	ll cnt=1;
	while(x)
	{
		if(x%2)	cnt=cnt*a%mod;
		a=a*a%mod;
		x/=2;
	}
	return cnt;
}

int main()
{
    cin>>n>>p;
    ll pp=oula(p);
    n=ksm(2,n,pp);
    cout<<ksm(2,n,p);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值