ABC 293 E

题目链接

前言

个人感觉这一场比赛 \(\tt{F<<E}\)

题面描述

给出整数 \(A,X,M\),求 \(\displaystyle \sum^{X-1}_{i=0} A^i\)

方法 \(1\)

\(2\mid Y-1\)\(\displaystyle \sum^{B-1}_{i=0} A^i=\displaystyle (\sum^{\frac{B-1}{2}}_{i=0} A^i) \times (1+A^{\frac{b+1}{2}})\)

\(2\nmid Y-1\)\(\displaystyle \sum^{B-1}_{i=0} A^i=\displaystyle (\sum^{\frac{B-1}{2}}_{i=0} A^i) \times (1+A^{\frac{b+1}{2}})+A^{B-1}\)

例如,\(3^0+3^1+3^2+3^3=(3^0+3^1)\times (1+3^2)\)。证明显然。

于是就可以分治。

点击查看代码
#include <bits/stdc++.h>

using namespace std;

#define dg(x) cout<<#x<<"="<<x<<endl

using ll = long long;

ll a,x,mod;

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

ll cal(ll n){
	if (n==1){
		return 1;
	}
	ll res=cal(n/2)*(1+pw(n/2))%mod;
	if (n&1){
		res+=pw(n-1);
	}
	return res%mod;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>a>>x>>mod;
	cout<<cal(x)%mod<<endl;
	return 0;
}

方法 \(2\)

人类智慧可得,\(\displaystyle \sum^{X-1}_{i=0} A^i=\frac{A^X-1}{A-1}\)。但是不一定 \(\gcd(A-1,M)=1\)

因为 \(A-1\mid A^X-1\),所以可以这样求答案:令 \(K≡A^X-1 \mod M(A-1)\)。答案是 \(\displaystyle \frac{K}{A-1}\)

要用 \(\tt{int128}\)

点击查看代码
#define int __int128
 
int a,x,m;
 
int pw(int b,int n,int mod){
	int res=1;
	while (n){
		if (n&1){
			res=res*b%mod;
		}
		b=b%mod*b%mod;
		n>>=1;
	}
	return res;
}
 
signed main(){
	read(a);
	read(x);
	read(m);
  	if (a==1){
		int ret=x%m;
		print(ret);
		return 0;
    }
	int res=pw(a,x,m*(a-1));
	res-=1;
	res=(res+m*(a-1))%(m*(a-1));
	res/=(a-1);
	res%=m;
	print(res);
	return 0;
}

方法 \(3\)

AtCoder 的官方题解。

点击查看代码
#include <bits/stdc++.h>

using namespace std;

#define dg(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 2;

ll a,x,mod;

struct matrix {
	int mat[N][N];
	void assign(int a,int b,int c,int d){
		mat[0][0]=a;
		mat[0][1]=b;
		mat[1][0]=c;
		mat[1][1]=d;
	}
	void init(int f){
		memset(mat,0,sizeof mat);
		for (int i=0; i<N; i++){
			mat[i][i]=f*1;
		}
	}
	matrix operator * (const matrix &a){
		matrix res;
		res.init(0);
		for (int i=0; i<N; i++){
			for (int j=0; j<N; j++){
				for (int k=0; k<N; k++){
					(res.mat[i][j]+=1ll*mat[i][k]*a.mat[k][j]%mod)%=mod;
				}
			}
		}
		return res;
	}
	matrix operator ^ (ll x){
		matrix res;
		res.init(1);
		matrix a;
		for (int i=0; i<N; i++){
			for (int j=0; j<N; j++){
				a.mat[i][j]=mat[i][j];
			}
		}
		while (x){
			if (x&1){
				res=res*a;
			}
			a=a*a;
			x>>=1;
		}
		return res;
	}
};

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>a>>x>>mod;
	matrix f;
	f.assign(a,1,0,1);
	cout<<(f^x).mat[0][1]<<endl;
	return 0;
}
posted @ 2023-03-19 20:05  SFlyer  阅读(31)  评论(0编辑  收藏  举报