牛客小白月賽9 A-簽到(逆元性質)
阿新 • • 發佈:2018-12-03
題目連結
https://ac.nowcoder.com/acm/contest/275/A
思路來源
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=37485613
心得
get到了逆元的性質,
比如說每次乘以的時候,直接乘以mod意義下的
而假設最後求的分數是,即時,
此時要求,只需%mod即可,
也就是說,逆元世界裡,沒有分母,剩下的可以統一過來。
順便在這裡寫下,階乘逆元的性質
由n!=(n-1)!*n,
則由inv(n!)=inv((n-1)!)*inv(n),
兩側同乘1/inv(n),即同乘inv(inv(n))=n知,
inv(n!)*n=inv((n-1)!)
因此,可利用inv(n)求inv(n-1),先求得inv(maxn)後,
可預處理出階乘逆元表,O(n)
當然用inv[i]=(mod-mod/i)*inv[mod%i]%mod也可,
求出每個的逆元之後階乘一下。
程式碼
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <map> #include <vector> #include <stack> #include <queue> #include <functional> const long long int INF=1e18; const int maxn=1e5+10; const int mod=1e9+7; const int MOD=998244353; const double eps=1e-9; typedef long long ll; #define vi vector<int> #define si set<int> #define pii pair<int,int> #define pi acos(-1.0) #define pb push_back #define mp make_pair #define lowbit(x) (x&(-x)) #define sci(x) scanf("%d",&(x)) #define scll(x) scanf("%lld",&(x)) #define sclf(x) scanf("%lf",&(x)) #define pri(x) printf("%d",(x)) #define rep(i,j,k) for(int i=j;i<=k;++i) #define per(i,j,k) for(int i=j;i>=k;--i) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int n; ll ans; ll modpow(ll x,ll n,ll mod) { ll res=1; while(n) { if(n&1)res=res*x; if(res>mod)res%=mod; x*=x; if(x>mod)x%=mod; n/=2; } return res; } int main() { ans=1; sci(n); rep(i,0,n-1) { int a,b; sci(a),sci(b); ans*=(b-a)*modpow(b,mod-2,mod)%mod; if(ans>mod)ans%=mod; } printf("%lld\n",(1-ans+mod)%mod); return 0; }