- 木姑娘的生日
- 2015-02-16 00:13:34 @
为什么我只有20分,实在不知道错在哪里,求各位AC程序研究下。。。。
以下我本渣的程序,求解答。
program ex;
var s:ansistring;
data:array[1..100001] of longint;
ans,sum,i,n:longint;
begin
readln(n); read(s); ans:=0; sum:=1;
for i:=1 to n-1 do
begin
sum:=(sum*2) mod 1000000007; ans:=(ans+sum) mod 1000000007;
data[i]:=sum mod 1000000007;
end;
sum:=(sum*2) mod 1000000007; data[n]:=sum mod 1000000007;
inc(ans);
for i:=1 to length(s) do
begin
if s[i]='7' then
begin
ans:=(ans+(data[n-i+1] div 2)) mod 1000000007;
end;
end;
write(ans);
end.
6 条评论
-
Platypus LV 9 @ 2015-02-16 18:30:47
直接把4视为二进制的0,7视为二进制的1,然后把这个二进制转成十进制就好了
因为可能有4444这样的数,直接转换的话相当于0,所以在最高位上加一个1,转换成10000这样,输出答案时再减掉1program vijos_1922;
const mo=1000000007;
var n,i,ans:longint;
ch:char;
begin
readln(n);
ans:=1;
for i:=1 to n do
begin
read(ch);
ans:=ans<<1;
if ch='7' then inc(ans);
ans:=ans mod mo;
end;
writeln(ans-1);
end. -
2015-02-16 10:20:54@
我是用二叉树的性质做的。。
-
2015-02-16 10:16:58@
没事了,看错题目,昨晚朝思夜想做梦的时候想出来了
-
2015-02-16 00:31:53@
实际上是考虑每一位的4或者7对这个数的index所产生的贡献
-
2015-02-16 00:30:56@
从最高位开始扫,若第k位是4,则ans+=2^(k-1),若第k位是7,则ans+=2*2^(k-1)
-
2015-02-16 00:20:18@
不知道原因都睡不了觉了,诶!!!
- 1