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<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#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<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#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<n;i++)
{
cin>>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<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<list>
#include<map>
#include<set>
#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<n-1;i++)
{
cin>>a>>b>>c;
s[a]=s[b]+c;
ans=max(ans,s[a]);
}
cout<<ans;
return 0;
}