题目连接
D-幂运算_2023河南萌新联赛第(四)场:河南大学 (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;
}