转载请注明出处,谢谢http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents by---cxlove
A:水题
B:高中概率知识 ,整出个式子,sigma( k*C(n+k,k)* (p^(n+1)*q^k+q^(n+1)*p^k) )
然后就没有然后了,现场的时候是边乘边除乱搞过的,比较优越的是取个对数
double p1=log(p),p2=log(1-p);
double c=0,ans=0;
double s1=(n+1)*p1,s2=(n+1)*p2;
for(int i=0; i<=n; i++)
{
ans+=(exp(c+s1)+exp(c+s2))*(n-i);
c+=log(n+i+1)-log(i+1);
s1+=p2;
s2+=p1;
}
J:看成a*b*c<=n,(a<=b<=c) 那么a<=pow(n,1.0/3),b<=pow(n/a,1.0/2)
然后就枚举a,b,得出c的数量
注意可以调换顺序,分为三种情况
三个数相等,则不需要调换
有两个相等,3种
两两不等,6种
LL n;
int fuck1(LL n)
{
int m=pow(n,0.5);
if((LL)(m*m)>n) m--;
if((LL)(1+m)*(m+1)<=n) m++;
return m;
}
int fuck2(LL n)
{
int m=pow(n,1.0/3);
if((LL)(m*m*m)>n) m--;
if((LL)(m+1)*(1+m)*(m+1)<=n) m++;
return m;
}
int main()
{
int cas=0;
while(cin>>n)
{
int m=fuck2(n);
LL ans=m;
for(int i=1; i<=m; i++)
{
int k=fuck1(n/i);
ans+=(n/i/i-i+k-i)*3;
for(int j=i+1; j<=k; j++) ans+=6*(n/i/j-j);
}
cout<<"Case "<<++cas<<": "<<ans<<endl;
}
return 0;
}
K题:悲伤,其实就是个水BFS,不解释
int flag[10];
int n,k;
int vis[10005];
void bfs()
{
mem(vis,0);
queue<pair<string,int> >que;
que.push(mp("",0));
while(!que.empty())
{
pair<string,int>u=que.front();
que.pop();
for(int i=0;i<10;i++)
{
if(i==0&&u.second==0) continue;
if(flag[i]) continue;
pair<string,int>v=u;
v.first+=(char)(i+'0');
v.second=(v.second*10+i)%n;
if(v.second == 0) {cout<<v.first<<endl;return ;}
if(vis[v.second]==0)
{
vis[v.second]=1;
que.push(v);
}
}
}
printf("-1\n");
}
int main()
{
int cas=0;
while(scanf("%d%d",&n,&k)!=EOF)
{
mem(flag,0);
for(int i=0;i<k;i++)
{
int m;
scanf("%d",&m);
flag[m]=1;
}
printf("Case %d: ",++cas);
if(k==0){printf("%d\n",n);continue;}
bfs();
}
return 0;
}