由A和B组成的串中,可以由多个(超过一个)相同的串首尾拼接后得到的串,称为周期串,现在请问有多少个长为n 的非周期串?
因为答案可能会很大,所以请输出对2019 取模的结果。
例如: “AAAA” 是周期串,因为它可以由两个 “AA” 拼接而成或者由四个 “A” 拼接而成。“AABBAABB” 是周期串,因为它可以由两个 “AABB” 拼接而成。“ABA” 和 “AABBAA” 则都是非周期串。
样例输入
3
4
样例输出
6
12
思路
由A和B组成长度为n的字符串 有
2
n
2^n
2n个
长度为n的周期串 可以 由 n的 约数 个 非周期串组成
所以枚举n的约数进行递归求解
递归边界为 n==1时 返回2
代码
import java.util.Scanner;
public class Main {
public int pow(int a, int b, int mod) {
int temp = a;
int ans = 1;
while (b != 0) {
if ((b & 1) == 1) {
ans *= temp;
ans %= mod;
}
temp *= temp;
temp %= mod;
b >>= 1;
}
return ans;
}
public int sovle(int n, int mod) {
int ans;
ans = pow(2, n, mod);
ans %= mod;
if (n == 1)
return ans;
ans -= 2;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
//填空 ans=/**/;
ans = (ans-sovle(i,mod)-sovle(n/i,mod)+mod)%mod;
}
}
int t = (int) Math.sqrt(n);
if (t * t == n) {
ans += sovle(t, mod);
ans %= mod;
}
return (ans + mod) % mod;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n;
while (cin.hasNext()) {
n = cin.nextInt();
Main t = new Main();
int s = t.sovle(n, 2019);
System.out.println(s);
}
}
}