牛客练习赛24 题解

https://www.nowcoder.com/acm/contest/157#question

A题:

m(1000)种石子,每种无限个,从这些石子中取出n(1000)个,并按顺序排列起来,为了好看,相邻的石子不能相同。有多少种排列的方法,结果模1e9+7.

第一个石子有m种取法,第2~n个的限制是不能与前一个相同,有m-1种取法.
答案是$m*(m-1)^{n-1} \bmod 1000000007$

复杂度O(n),可以用快速幂优化.

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
 
#define INF 0x3f3f3f3f
#define maxn 10000
#define mod 1e9+7;
#define ll long long int
const ll p=1e9+7;
using namespace std;
 
ll pw(ll a,ll b){
    ll ret=1;
    while(b){
        if(b&1)
            ret=ret*a%p;
        a=a*a%p;
        b>>=1;
    }
    return ret;
}
int main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    int n,m;scanf("%d%d",&n,&m);
    printf("%lld",1ll*m*pw(m-1,n-1)%p);
    return 0;
}

B题:

C题:

预处理统计出所有的答案,对于每个询问直接输出

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
 
#define INF 0x3f3f3f3f
#define maxn 1000000+5
#define mod 1e9+7;
#define ll long long int
 
using namespace std;
 
ll pw(ll a,ll b){
    ll ret=1;
    while(b){
        if(b&1)
            ret=ret*a;
        a=a*a;
        b>>=1;
    }
    return ret;
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;cin>>n>>m;
    char s;
    int r[maxn],b[maxn];
    memset(r,-1,sizeof(r));memset(b,-1,sizeof(b));
    int cnt_r=1,cnt_b=1;
    for(int i=0;i>s;
        if(s=='R')
            r[cnt_r++]=i+1;
        if(s=='B')
            b[cnt_b++]=i+1;
    }
    while(m--)
    {
        string color;int x;
        cin>>color>>x;
        if(color=="R")
            printf("%d\n",r[x]);
        if(color=="B")
            printf("%d\n",b[x]);
    }
    return 0;
}

D题:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
 
#define INF 0x3f3f3f3f
#define maxn 50000+5
#define mod 1e9+7;
#define ll long long int
 
using namespace std;
 
ll pw(ll a,ll b){
    ll ret=1;
    while(b){
        if(b&1)
            ret=ret*a;
        a=a*a;
        b>>=1;
    }
    return ret;
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,s[maxn];cin>>n;
    int a,b,c;int ans=-100;
    for(int i=0;i>a>>b>>c;
        s[a]=s[b]+c;
        ans=max(ans,s[a]);
    }
    cout<

 

你可能感兴趣的:(牛客网)