2022-6-6 真题练习
描述
求字典序在 s1 和 s2 之间的,长度在 len1 到 len2 的字符串的个数,结果 mod 1000007。
数据范围:1 \le len(s1),len(s2) \le 50 \1≤len(s1),len(s2)≤50 ,1 \le len1,len2 \le 50 \1≤len1,len2≤50
注意:本题有多组输入
输入描述:
每组数据包涵s1(长度小于50),s2(长度小于50),len1(小于50),len2(大于len1,小于50)
输出描述:
输出答案。
1 import java.util.Scanner; 2 3 public class Main { 4 final static int MOD= 1000007; 5 public static void main(String[] args) { 6 Scanner sc=new Scanner(System.in); 7 while (sc.hasNext()){ 8 String s1=sc.next(); 9 String s2=sc.next(); 10 int len1=sc.nextInt(); 11 int len2=sc.nextInt(); 12 int ans=0; 13 // 中间那块 14 int first=s2.charAt(0)-s1.charAt(0); 15 for (int i=len1;i<=len2;i++){ 16 int add=(int)(first*Math.pow(26,i-1)%MOD); 17 ans+=add; 18 // 比s1小的那块 19 for (int j=1;j<s1.length();j++){ 20 ans-=(int)((s1.charAt(j)-'a')*Math.pow(26,i-1-j)); 21 } 22 // 比s2小的那块 23 for (int j=1;j<s2.length();j++){ 24 ans+=(int)((s2.charAt(j)-'a')*Math.pow(26,i-1-j)); 25 } 26 27 } 28 System.out.println(--ans); 29 30 } 31 } 32 }
思路:先计算与当前长度保证开头的所有情况,再减去比s1小的,加上比s2小的。最后去掉s2本身。