G题逆元能用拓展欧几里得吗
这个通过率只有25%,不知道为什么通过不了,但是用快速幂能过,这是为啥,什么时候用快速幂,什么时候用拓展欧几里得啊
#include <bits/stdc++.h> using namespace std; #define int long long using ll = long long; const int N = 2e5 + 10; const ll mod = 1e9 + 7; int a[N]; int pre[N],suf[N],q[N]; ll exgcd(ll a,ll b,ll &x,ll &y){//是这个x和y会变的很大吗,那什么时候用拓展欧几里得,什么时候用小费马呢 ll p,tmp; if(!b) { p = a,x = 1,y = 0; }else{ p = exgcd(b,a%b,x,y); tmp = x; x = y; y = tmp - (a / b) * y; } return p; } ll qm(ll a,ll b){ ll res = 1; while(b){ if(b&1){ res = (res * a) % mod; } a = (a * a) % mod; b >>= 1; } return res; } signed main() { int n;cin >> n; for(int i = 1;i <= n;i ++)cin >> a[i]; sort(a + 1,a + 1 + n); for(int i = 1;i <= n;i ++){ pre[i] = (pre[i-1] + a[i])%mod; } for(int i = n;i >= 1;i --){ suf[i] = (suf[i + 1] + a[i])%mod; } int al = 0; for(int i = 1;i <= n;i ++){ al = (al + (suf[i + 1] - a[i] * (n-i) + a[i]*(i-1) - pre[i-1] + mod) ) %mod; } //这里是拓展欧几里得求的,但是不知道为什么不对 ll x=1,y=0; if(exgcd(n,mod,x,y) == 1){ x = (x * al) % mod; } cout << x <<endl; // cout << (al % mod * qm(n,mod-2)%mod) <<endl; return 0; }
}