欧拉降幂和广义欧拉降幂
逆元详解
初等数论 - 定理证明
题意
有三个杯子都倒放在桌面上,中间的杯子里有筛子,每一次都把中间的杯子与左右两边的杯子等概论交换,问交换n后,筛子还在中间的杯子里的概率,对该式子约分之后 分母分子分别%1e9+7 输出分子分母。
n非常大,给你k个数,n就是这k个数的乘积。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,phimod=mod-1;//phimod是mod的欧拉值
typedef long long ll;
ll quick_mod(ll c,ll p,ll mod){
ll res=1;
while(p){
if(p&1) res=res*c%mod;
c=c*c%mod,p>>=1;
}
return res;
}
int main(){
int n;scanf("%d",&n);
ll mi=1,jo=0;int num=0;
for(int i=1;i<=n;++i){
ll x;scanf("%lld",&x);
if(!(x&1)) ++num;//判断n的奇偶
x=x%phimod,mi=mi*x%phimod;//欧拉降幂求指数
}
mi=(mi+phimod-1)%phimod;//求的是2^n 应该是2^(n-1)
ll inv3=quick_mod(3,mod-2,mod),p,q;//3关于1e9+7的逆元
p=quick_mod(2,mi,mod),q=p;//p q分别为分子分母
(!num)?(p-=1):(p+=1);
p=(p+mod)%mod*inv3%mod;//由于p可能-1 所以p+mod.
printf("%lld/%lld\n",p,q);
}