我是竞争性编程世界的新手,我遇到了一个问题,试图计算只包含数字的大字符串的子串数。但是当我尝试在scorify平台上运行程序时,它给了我TimeLimitExceeded错误。所以,如果他们在最小化代码复杂性方面有任何帮助,我将非常感激
import java.util.Scanner;
import java.math.BigInteger;
public class test {
coprime是检测这两个数字是否互质的方法。
private static Boolean coprime(long a, long b) {
long t;
while(b!=0){
t = b;
b = a%b;
a = t;
}
if(a==1)
return true;
return false;
}
我们的主要:)
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//t is the number of test cases
int t =sc.nextInt();
String s;
// n is the length of the string that we are going to scan .
int n;
//subs is the number of substrings found .
int subs;
// m is the long that we are going to compare the substrings with .
long m;
for(int i=0;i<t;i++){
subs = 0;
n=sc.nextInt();
m=sc.nextLong();
sc.nextLine();
s = sc.nextLine();
// I separated the cases of the length of s to optimize a little bit because BigIntegers are pain on the memory i think
//case 1: if the string(number s) entered is greater then the long max value (not so specific)
if(s.length()>=19){
BigInteger a;
// looping through all the substrings
for(int j=0;j<n;j++){
for(int p=j;p<n;p++){
a = new BigInteger(s.substring(j,p+1));
if(a.gcd(BigInteger.valueOf(m)).compareTo(BigInteger.ONE)==0){
subs++;
}
}
}
}
// case 2 : if the string(number entered is in the range of long numbers.
else{
for(int j=0;j<n;j++){
for(int p=j;p<n;p++){
if(coprime(m,Long.parseLong(s.substring(j,p+1)))){
subs++;
}
}
}
}
//printing the number of substrings.
System.out.println(subs);
}
}
注意: 输入规格:
第一行输入包含测试用例数T(1≤T≤10)。
每个测试用例的第一行包含两个整数:N(1≤N≤1000),字符串的长度 和M(1≤M≤1000000000)。
第二行包含一个长度为N的字符串S.它保证S只包含数字。
例如:
输入:
1
10 324567
9207289341
输出:
40
此外:
如果您有关于组织我的代码的说明,我将很高兴听到
谢谢。对于那些提出问题的人。
问题C.共素子串
如果它们的最大公约数等于1,则说两个正整数是共同素数。现在给定一个数字串S和一个整数M,我们有兴趣计算S的子串的数量。与M合作。
输入规格:
第一行输入包含测试用例数T(1≤T≤10)。
每个测试用例的第一行包含两个整数:N(1≤N≤1000),字符串的长度和M(1≤M≤1000000000)。
第二行包含一个长度为N的字符串S.它保证S只包含数字。
输出规格:
对于每个测试用例打印,在单行上,与M共同构成的S的子字符串数。
STDIN
这是STDIN的内容。
1
10 324567
9207289341个
STDOUT
您的解决方案应该产生类似的结果。
40