http://acm.hdu.edu.cn/showproblem.php?pid=6754
题意:
字符串由小写字母构成
求 长度为N的 回文子串数量最少的 字符串的个数
思路:
长度为1的串 回文子串最少1个 形式:a
长度为2的串 回文子串最少2个 形式:aa / ab
长度为3的串 回文子串最少3个 形式:aaa / aab aba abb / abc
经试验,
长度为4的串 回文子串最少1个 形式:abca
猜想,长度>3的串 最少可以只有3个回文子串(abcabc... 其中只构成 a b c 3个回文串
证明:添加字母会增加新的子串d使得回文子串数目>=4,减少到两个或者一个字母会不足以维持只有3个回文子串,3个字母保证3种回文子串只有一种排列
编码:
分为长度 1、2、3、>3,分别输出结果
#include<cstdio> #include<cstring> #include<algorithm> #include<bitset> #include<cassert> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<deque> #include<iomanip> #include<list> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #include <vector> #include <iterator> #include <utility> #include <sstream> #include <limits> #include <numeric> #include <functional> using namespace std; #define gc getchar() #define mem(a) memset(a,0,sizeof(a)) //#define sort(a,n,int) sort(a,a+n,less<int>()) #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); long long Mode(long long a, long long b, long long mode) { long long sum = 1; while (b) { if (b & 1) { sum = (sum * a) % mode; b--; } b /= 2; a = a * a % mode; } return sum; } int main() { int T = 0; long long n = 0; cin >> T; while(T--) { cin >> n; if(n == 1) { cout << 26 << endl; continue; } else if(n == 2) { cout << 26 + 26*25 << endl; continue; } else if(n == 3) { cout << 26 + 26*25*3 +26*25*24 << endl; continue; } else { cout << 26*25*24 << endl; continue; } } return 0; }