费马小定理
作者:互联网
链接:https://ac.nowcoder.com/acm/problem/205461
王子连接的国服终于上线啦~已知王子连接的抽卡系统如下:
共有 个卡池,第 个卡池共有 种卡,每张卡的出货率都是相等的(也就是说该卡池单次抽卡,每种卡出货率是 1/ai1/a_i1/ai )。
第 个卡池中,你有 种卡是自己很想要的。
现在的问题是,如果每个卡池里都单抽一次,能抽到自己想要的卡的概率是多少?
可以证明,这个概率一定可以写成 形式的分数。最后输出该分数在模 109+710^9+7109+7意义下的值就可以了。
即输出满足 b∗x%1000000007=ab*x\%1000000007=ab∗x%1000000007=a 的最小非负整数 。
输入描述:
第一行输入一个正整数
。第二行输入 个正整数 aia_iai。
第三行输入 个正整数 bib_ibi ,代表第 个卡池的你想要的卡种类数量。
输出描述:
一个整数,表示该概率在模 109+710^9+7109+7 意义下的值。示例1
输入
复制2 3 4 1 1
输出
复制500000004
说明
能抽到自己想要的卡的概率是1/2,由于2*500000004%1000000007=1,故输出500000004。
感觉就是费马定理的一道模板题
https://blog.csdn.net/slongle_amazing/article/details/50669001
需要用到快速幂的知识点
#include<bits/stdc++.h> using namespace std; int n; long long a[100005]; int mod=1e9+7; long long qmi(long long ans,long long p){ long long temp=1; while(p){ if(p&1) temp=temp*ans%mod; ans=ans*ans%mod; p>>=1; } return temp; } int main() { cin>>n; long long ans=1; for(int i=0;i<n;i++){ cin>>a[i]; } long long temp; for(int i=0;i<n;i++) { cin>>temp; ans=ans*(a[i]-temp)%mod*(qmi(a[i],mod-2))%mod; } cout<<(1-ans+mod)%mod<<endl;//因为求的是b/a=(1-没抽到)
目前求的是没抽到的逆元,故要再转化一下。 }
标签:费马,temp,int,定理,long,1000000007,ans,mod 来源: https://www.cnblogs.com/Charls/p/12913878.html