【算法题】长度为3的回文子序列的数量

小红定义一个字符串的权值为: 长度为3的回文子序列的数量。例如,"abbab"的权值为5,因为有2个"aba"子序列,2个"bab"子序列和1个"bbb"子序列。
现在小红想知道,长度为n的、仅由小写字母组成的字符串的权值之和是多少,你能帮帮她吗?
定义字符串的子序列为:字符串选择若干字符(不一定连续)按原串顺序组成的新串。

输入描述
一个正整数n,不大于10^9
输出描述
长度为n的、仅由小写字母组成的字符串的权值之和。由于答案过大,请对10^9+7取模。

示例1
输入

3

输出

676

说明
以下类型的字符串权值为1∶aba,aaa,qwq等。共有676个。

这题和牛客周赛Round 14 的第四题不一样,那题是子串,字符必须连续,所以系数是 (n-2) ;而这题是子序列,系数是一个组合数(n个字符中选3个)
( n 3 ) = n ( n − 1 ) ( n − 2 ) 6 \binom{n}{3} = \frac{n(n-1)(n-2)}{6} (3n)=6n(n1)(n2)
Java代码:

import java.util.Scanner;
public class Test {
    
    
    static final int MOD = 1000000007;
    
    private static long qpow(long base, int exp) {
    
    
        long result = 1;
        while (exp > 0) {
    
    
            if ((exp & 1) != 0) {
    
    
                result = result * base % MOD;
            }
            base = base * base % MOD;
            exp >>= 1;
        }
        return result;
    }
    
    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);
        long n = scanner.nextLong();

        if (n < 3) {
    
    
            System.out.print(0);
        } else {
    
    
            long num = n * (n - 1) % MOD * (n - 2) % MOD / 6;
            long count = qpow(26, (int)n - 1) * num % MOD;
            System.out.println(count);
        }
    }
}

代码未经过题目验证

猜你喜欢

转载自blog.csdn.net/bthbt/article/details/138093122