其他分享
首页 > 其他分享> > 费马小定理

费马小定理

作者:互联网

链接: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