为ACGT四种字符计数,假设最多的有MAX个,然后看有多少种字符的数量达到MAX,假设为cnt。那么答案就是cnt^n,快速幂算出。原因很简单,只需要固定s,循环移动t考虑,假设t的第一位准备填'A',那么它的贡献肯定就是s中A的个数,所以肯定选贡献最大(出现最多)的字符。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
char dna[100010];
const ll mod=1e9+7;
//ACGT 0 1 2 3
int cnt[10];
ll Pow(ll a,ll n){
ll tmp=a,res=1LL;
while(n){
if(n&1LL){
res*=tmp;
res%=mod;
}
tmp*=tmp;
tmp%=mod;
n>>=1;
}
return res;
}
int main(){
int n;
cin>>n;
scanf("%s",dna);
for(int i=0;i<n;i++){
if(dna[i]=='A'){
cnt[0]++;
}
if(dna[i]=='C'){
cnt[1]++;
}
if(dna[i]=='G'){
cnt[2]++;
}
if(dna[i]=='T'){
cnt[3]++;
}
}
int MAX=0;
for(int i=0;i<4;i++)MAX=max(MAX,cnt[i]);
ll t=0;
for(int i=0;i<4;i++){
if(cnt[i]==MAX)t++;
}
ll ans=Pow(t,n);
cout<<ans<<endl;
return 0;
}
B Cubes
用两个堆(也可以用其他数据结构)维护可以被卸下的Cubes。。然后贪心轮流取最大最小就可以了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+9;
map<pair<int,int>,int> mp;
int x[100010];
int y[100010];
ll ans[100010];
bool unable[100010]; //用于延迟删除
//检查某个位置可不可拿
bool judge(int xx,int yy){
int ok=1;
if(mp.count(make_pair(xx,yy+1))){
if( mp.count(make_pair(xx-1,yy))==0&& mp.count(make_pair(xx+1,yy))==0 )return 0;
}
if(mp.count(make_pair(xx+1,yy+1))){
if( mp.count(make_pair(xx+1,yy))==0&& mp.count(make_pair(xx+2,yy))==0 )return 0;
}
if(mp.count(make_pair(xx-1,yy+1))){
if( mp.count(make_pair(xx-2,yy))==0&& mp.count(make_pair(xx-1,yy))==0 )return 0;
}
return ok;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
mp[make_pair(x[i],y[i])]=i;
}
priority_queue<int> MAX;
priority_queue<int,vector<int>,greater<int> > MIN;
for(int i=1;i<=n;i++){
if(judge(x[i],y[i])){
MAX.push(mp[make_pair(x[i],y[i])] );
MIN.push(mp[make_pair(x[i],y[i])] );
}
}
for(int i=1;i<=n;i++){
int xx,yy;
if(i&1){ //最大
ans[i]=MAX.top();
MAX.pop();
}else{ //最小
ans[i]=MIN.top();
MIN.pop();
}
if(unable[ans[i]]){
i--;
continue;
}
if(!judge(x[ans[i]],y[ans[i]])){ //一定要记得检查能不能拿。。因为之前可拿的可能变为不可拿
i--;
continue;
}
unable[ans[i]]=1;
xx=x[ans[i]];
yy=y[ans[i]];
mp.erase(make_pair(xx,yy));
if(mp.count(make_pair(xx-1,yy-1))){
if(judge(xx-1,yy-1)){
MAX.push(mp[make_pair(xx-1,yy-1)] );
MIN.push(mp[make_pair(xx-1,yy-1)] );
}
}
if(mp.count(make_pair(xx,yy-1))){
if(judge(xx,yy-1)){
MAX.push(mp[make_pair(xx,yy-1)] );
MIN.push(mp[make_pair(xx,yy-1)] );
}
}
if(mp.count(make_pair(xx+1,yy-1))){
if(judge(xx+1,yy-1)){
MAX.push(mp[make_pair(xx+1,yy-1)] );
MIN.push(mp[make_pair(xx+1,yy-1)] );
}
}
}
ll tmp=1;
ll re=0;
for(int i=n;i>=1;i--){
re+=(ans[i]-1)*tmp;
re%=mod;
tmp*=n;
tmp%=mod;
}
cout<<re<<endl;
return 0;
}