EOF)
{
scanf("%I64d",&k);
int len=strlen(save);
ll ans=0;
ll M=quick(2,len);
M=quick(M-1,1000000005); //求出分母的逆元
for(int i=0;i if(save[i]=='0'||save[i]=='5')
ans=(ans+save1[i])%m; //先求出一个串的情况
ans=(ans*(quick(2,len*k)-1))%m*M%m;//根据等比数列公式
printf("%I64d\n",ans);
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define m 1000000007
char save[110000];
ll quick(ll a,ll n) //快速幂求a^n%m
{
ll res=1;
while(n)
{
if(n&1)
res=(res*a)%m;
n=n>>1;
a=a*a%m;
}
return res;
}
int save1[110000];
int main()
{
ll k;
save1[0]=1;
save1[1]=2;
for(int i=2;i<=100000;i++)
save1[i]=(save1[i-1]*2)%m;
while(scanf("%s",save)!=EOF)
{
scanf("%I64d",&k);
int len=strlen(save);
ll ans=0;
ll M=quick(2,len);
M=quick(M-1,1000000005); //求出分母的逆元
for(int i=0;i if(save[i]=='0'||save[i]=='5')
ans=(ans+save1[i])%m; //先求出一个串的情况
ans=(ans*(quick(2,len*k)-1))%m*M%m;//根据等比数列公式
printf("%I64d\n",ans);
}
return 0;
}
D. Block Tower
题目意思:
在每个.处都可以填R,得到100个人,在每个R旁边都可以填B,得到200个人。
可以随时销毁一个R或者B,问你怎样安排,能使得得到的人数最多,输出填充的方案。
解题思路:
dfs
容易证明,每一块联通的.区都可以凑成一个B和其他的都是R,这样得到的人数肯定是最多的。
一遍dfs,然后直接输出就可以了。
代码:
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#