小x的字符串(乘法原理)

来源:互联网 发布:淘宝客怎么查看佣金 编辑:程序博客网 时间:2024/06/06 12:47

题意:

 小x有两个长度均为n的字符串s和w。小x认为s和w是不可比较的,当存在i和j (0<=i,j<=n),si>wi并且sj<wj。si表示字符串s中的第i个元素,相似的,wj表示字符串w中第j个元素。 字符串模板由数字和问号“?”构成,“?”并不会成对出现。 小x现在有两个长度为n的字符串模板。每个问号可以填不同的数或相同的数,小x想要计算填数的方案数,使得这两个字符串不可比较。最终得到的字符串可以包含前导零。 帮助小x计算出方案数除以1000000007的余数。

思路:

因为只要有一个大于或者小于他们就是不可比较的,所以只有他们全部大于等于或者全部小于等于时时可以计算出可以比较的,所以不可以比较的=所有的-可以比较的

程序:

        ans,x,y,z,o:int64;begin        x:=1; a[0]:=1; b[0]:=1; c[0]:=1;        readln(n);        readln(s1);        readln(s2);        for i:=1 to n do         if (s1[i]='?') and (s2[i]='?') then         begin                a[i]:=(a[i-1]*55) mod p;                b[i]:=(b[i-1]*55) mod p;                c[i]:=(c[i-1]*10) mod p;                x:=(x*100) mod p;         end else         if (s1[i]='?')  then         begin                a[i]:=(a[i-1]*(ord(s2[i])-47)) mod p;                b[i]:=(b[i-1]*(58-ord(s2[i]))) mod p;                c[i]:=c[i-1];                x:=(x*10) mod p;         end else         if (s2[i]='?') then         begin                a[i]:=(a[i-1]*(58-ord(s1[i]))) mod p;                b[i]:=(b[i-1]*(ord(s1[i])-47)) mod p;                c[i]:=c[i-1];                x:=(x*10) mod p;         end else         if (s2[i]=s1[i]) then         begin                a[i]:=a[i-1];                b[i]:=b[i-1];                c[i]:=b[i-1];         end else         if (s2[i]>s1[i]) then a[i]:=a[i-1] else b[i]:=b[i-1];         ans:=(x-a[n]-b[n]+c[n]+p) mod p;         writeln(ans);end.
0 0
原创粉丝点击