1. 程式人生 > >逆元的一個坑點 - 牛客

逆元的一個坑點 - 牛客

\n oid 不同 滿足 tdi target n) 過程 print

鏈接:https://www.nowcoder.com/acm/contest/129/A
來源:牛客網

有一個長度為n的序列a,已知a[1]=a[n]=1,且對於2 <= x <= n,a[x] / a[x-1]是以下三個數字之一 [ 1,-2,0.5 ],問有多少種不同的序列滿足題意。 兩個序列不同當且僅當它們有至少一個位置上的數字不同,序列a可以為任何實數。

輸入描述:

一個整數 表示n (1<= n <= 1e3)

輸出描述:

一個整數 表示答案模10

9

+7
示例1

輸入

復制
5

輸出

復制
7


題意 : 給你一個一個 n ,表示要構造的序列的長度,問最終有多少種構造序列的方式。
思路分析:註意觀察要構造的序列有個特點,就是第一個和最後一個元素都是 1,所以說再變換的過程中,序列擴大和縮小的次數應該是相同的
    有個很坑的地方,就是再用逆元求解的時候,分母的兩個數都是取模得來的,應該分別求逆元才對
代碼示例:
#define ll long long
const ll maxn = 1e6+5;
const ll mod = 1e9+7;

ll pp[1005];
 
void init(){
    pp[0]=1;
     
    for(ll i = 1; i <= 1000; i++){
        pp[i]=pp[i-1]*i;
        pp[i] %= mod;
    }
}
 
ll inv(ll x, ll cnt){
    ll ans = 1;
     
    while(cnt > 0){
        if (cnt&1) ans *= x;
        ans %= mod;
        x *= x;
        x %= mod;
        cnt >>= 1;
    }
    return ans;
}
 
ll C(ll n, ll m){
    ll res = pp[n]*inv(pp[m], mod-2)%mod*inv(pp[n-m], mod-2);
     
    res %= mod;
    return res;
}
 
int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    ll n;
     
    cin >> n;
    init();
    
    ll x = 0, len = n-1;
    ll sum=0;
    //printf("*** %lld \n", C(20, 2));
    while(x <= len/2){
        sum += C(len, x)*C(len-x, x);
        x += 2;
        sum %= mod;     
    }
    printf("%lld\n", sum);
    return 0;

方法二:

直接套用組合數學的公式即可。

#define ll long long
const ll maxn = 1e6+5;
const ll mod = 1e9+7;

ll c[1005][1005];

void init(){
    c[0][0] = 1;
    for(int i = 1; i <= 1000; i++){
        c[i][0] = c[i][i] = 1;
        for(int j = 1; j < i; j++){
            c[i][j] = (c[i-1][j]+c[i-1][j-1])%mod;
        }
    }
}

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    ll n;
    
    cin >> n;
    init();
    
    ll x = 0, len = n-1;
    ll sum=0;
    //printf("*** %lld \n", C(20, 2));
    while(x <= len/2){
        sum += c[len][x]*c[len-x][x];
        x += 2;
        sum %= mod; 
    }
    printf("%lld\n", sum);
    return 0;
}

逆元的一個坑點 - 牛客