标签:乘法 上下 sum 总数 test put out 状态 递推
?1 5
?2 9
?3 3
?1.0000
?1.2000
?2.2000
1 1 1(x=3) 1 1 2(x=2) 1 1 3(x=2)
1 2 2(x=2) 1 2 3(x=1) 1 3 3(x=2)
2 2 2(x=3) 2 2 3(x=2) 2 3 3(x=2)
3 3 3(x=3)
题目难度与题目顺序无关。
请注意精度问题。
?
更新时,累加前面两种情况:
上一个选择的元素是最新的元素
上一个选择的元素不是最新元素
需要判重的情况:
众数个数超过k个的话。
如果同一个元素在这里累积了k+1次,就应该去掉。
sum[ k ][ i ][ j ]=sum[ k ][ i - 1 ][ j - 1 ]+sum[ k ][ i - 1 ][ j ];
if( k < i )sum[ k ][ i ][ j ]-=sum[ k ][ i - k - 1 ][ j - 1 ];
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T,m,n;
long double C[255],sum[255][255][255],f[255][255][255],g[255];
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
C[0]=true;
for(register int k=1;k<=251;++k){
sum[k][0][0]=1;
for(register int i=1;i<=251;++i){
for(register int j=1;j<=i;++j){
//i->序列长度 j->总共使用的元素个数 k->众数的个数
//sum存储的就是在当前的众数个数的情况下,可以构造出来的序列个数。
//由于是一步一步递推得到,可以直接适用于所有m∈[1,251]的情况。
sum[k][i][j]=sum[k][i-1][j-1]+sum[k][i-1][j];
//这里维护的是一个前缀和:求的是众数个数为k情况下序列总个数的和
//更新时,累加前面两种情况:
//->上一个选择的元素是最新的元素
//->上一个选择的元素不是最新元素
if(k<i){
sum[k][i][j]-=sum[k][i-k-1][j-1];
//需要判重的情况:众数个数超过k个的话。
//等效于->如果同一个元素在这里累积了k+1次,就应该去掉。
}
}
}
}
while(cin>>m>>n){
memset(g,0,sizeof(g));
for(register int i=1;i<=m;++i){
C[i]=C[i-1]*(n-i+1)/i;
}//O(m)递推求组合数
for(register int k=1;k<=m;++k){
for(register int j=1;j<=m;++j){
g[k]+=sum[k][m][j]*C[j];
}//计数求和。
}
long double ans=0;
//g表示的是总共可能出现的情况种类数,是累加
for(register int k=1;k<=m;++k){
ans+=k*(g[k]-g[k-1])/g[m];
} //给出答案
printf("%.4Lf\n",(double)ans);
}
return 0;
}
4 ≤ ??2 ≤ 10^6
对于100%的数据:保证??2不是质数。
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 1000010
using namespace std;
int H_2,cnt,ans=MAXN,prime[MAXN];
bool vis[MAXN];
void Get_Prime(int n){
vis[1]=true;
for(int i=2;i<=n;++i){
if(!vis[i]){
prime[++cnt]=i;
}
for(int j=1;j<=cnt&&i*prime[j]<=n;++j){
vis[i*prime[j]]=true;
if(i%prime[j]==0)break;
}
}
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&H_2);
Get_Prime(H_2);
//Get Prime List
queue<int>Prime2;
int tmp_H2=H_2;
for(int i=1;i<=cnt;++i){
if(tmp_H2==1)break;
if(tmp_H2%prime[i]==0){
while(tmp_H2%prime[i]==0){
tmp_H2/=prime[i];
}
Prime2.push(prime[i]);
}
}
queue<int>HH1;
while(!Prime2.empty()){
int tmp=Prime2.front();
Prime2.pop();
for(int i=H_2-tmp+1;i<=H_2;++i){
if(vis[i]){
HH1.push(i);
}
}
}
while(!HH1.empty()){
int tmp=HH1.front();
HH1.pop();
int tt=tmp;
for(int i=1;i<=cnt;++i){
while(tt%prime[i]==0){
tt/=prime[i];
}
if(tt==1){//tt除完了
ans=min(ans,tmp-prime[i]+1);
break;
}
if(!vis[tt]){//tt已经是素数
ans=min(ans,tmp-tt+1);
break;
}
}
}
printf("%d",ans);
return 0;
}
chess.in:
? 3 2 2
? BW
? WW
? 2 2
? WW
? WW
? 2 2
? WB
? BW
chess.out:
? H
? C
? C
1 ≤ n,m ≤ 100
对于100%的数据:1 ≤ T ≤ 100。
#include<cstdio>
#include<cstring>
char ch[110][110];
int main(){
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
int T,n,m;
scanf("%d",&T);
while(T--){
// memset(ch,0,sizeof(ch));
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;++i){
for(register int j=1;j<=m;++j){
do{
ch[i][j]=getchar();
}while(ch[i][j]==‘ ‘||ch[i][j]==‘\n‘);
}
}
if(ch[1][1]==‘B‘){
puts("H");
}else{
puts("C");
}
}
return 0;
}
标签:乘法 上下 sum 总数 test put out 状态 递推
原文地址:https://www.cnblogs.com/maomao9173/p/9791219.html