classSolution{private:
vector<vector<int>> f;
vector<vector<string>> ret;
vector<string> ans;int n;public:voiddfs(const string& s,int i){if(i == n){
ret.push_back(ans);return;}for(int j = i; j < n;++j){if(f[i][j]){
ans.push_back(s.substr(i, j - i +1));dfs(s, j +1);
ans.pop_back();}}}
vector<vector<string>>partition(string s){
n = s.size();
f.assign(n,vector<int>(n,true));for(int i = n -1; i >=0;--i){for(int j = i +1; j < n;++j){
f[i][j]=(s[i]== s[j])&& f[i +1][j -1];}}dfs(s,0);return ret;}};
classSolution{public:boolisPrim(int x){if(x ==1){returnfalse;}for(int i =2; i <=sqrt(x); i++){if(x % i ==0){returnfalse;}}returntrue;}intprimePalindrome(int n){int left =1;while(1){int right = left *10;for(int op =0; op <2; op++){for(int i = left; i < right; i++){int sum = i;int x =(op ==0)? i /10: i;while(x >0){
sum = sum *10+ x %10;
x /=10;}if(sum >= n &&isPrim(sum)){return sum;}}}
left = right;}return1;}};
classSolution{public:intcountPrimes(int n){
vector<int> primes;
vector<int>isPrime(n,1);for(int i =2; i < n;++i){if(isPrime[i]){
primes.push_back(i);}for(int j =0; j < primes.size()&& i * primes[j]< n;++j){
isPrime[i * primes[j]]=0;if(i % primes[j]==0){break;}}}return primes.size();}};