2023河南萌新联赛第(三)场:郑州大学 F

把题中所给的式子进行展开,最终可以得到一个等比数列。运用等比数列求和公式即可。

相关知识点:欧拉降幂,逆元。

逆元的用处:因为求和公式需要去除分子,而大数除法去取模会丢失精度,所以可以采用求出分子在mod意义下的逆元,然后进行乘法运算即可。

欧拉降幂:因为文明需要求出等比数列的项数,而项数为2的1e18级别,对此我们在快速幂过程中必然会进行取模操作,而对于这种指数比较大的数,a^{b}%c!=a^{b\% c}%c。所以需要进行欧拉降幂。 而我们一个质数p的欧拉函数值即为 p-1.

#include<bits/stdc++.h>

using namespace std;
const int N=1e6+5;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef array<int,3> p3;
ll mod=998244353;
const int maxv=4e6+5;

ll qmi(ll a,ll  b)
{
    ll res=1;
    while(b){
        if(b & 1) res=res*a%mod;
        b>>=1;
        a=(a%mod)*(a%mod) % mod;
    }
    return res%mod;
}

ll inv(ll x)
{
    return qmi(x,mod-2);
}



void solve()
{	

    ll n,x;
    cin>>n>>x;
    if(n==0){
        cout<<(1+x)%mod<<endl;
        return ;
    }
    if(x%mod==1) {
        ll ans=qmi(2,n+1);
        cout<<ans<<endl;
        return  ;
    }
    mod--;
    ll res=qmi(2,n+1);
    //cout<<res<<endl;
    //cout<<qmi(x,res)<<endl;
    mod++;
    ll f=(qmi(x,res)-1+mod)%mod;
    ll z=inv(x-1);
    //cout<<z<<endl;
    cout<<f*z%mod<<endl;




}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	t=1;
	//cin>>t;
	while(t--){
		//if(n==0) break;
		solve();
	}
	//system("pause");
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值