/**
题意:给定目标串S(由小写字母构成),统计取出S的字符组成的不同串的个数;
define :不同串:
1 :不同位置的相同字符
2 :一个串不存在相同的字符
思路:统计每个小写字母的数量,考虑每个字母存在 取1个与不取 的情况,累乘即可
最后去除空的情况
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
const int maxn = 1e5+7;
ll sum[27];
int main (){
int n;cin>>n;
string s;cin>>s;
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++) sum[s[i]-'a']++;
ll ans=1;
for(int i=0;i<=26;i++) ans=ans*(sum[i]+1)%mod;
ans=(ans-1+mod)%mod;
cout<<ans<<endl;
return 0;
}
/**
题意:从给定数组中,选择两个相同的数字,可将相同数字之间的数字变为和该相同数字一样,该操作可以进行不定次数;
思路:考虑存在交叉的情况,记录相邻相等数的位置,利用鸽巢定理直接进行dp即可;
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
const int maxn = 5e5+7;
int pre[maxn],pos[maxn],a[maxn];;
ll dp[maxn];
int main (){
int n;cin>>n;
for(int i=0;i<n*2;i++) pre[i]=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) pre[i]=pos[a[i]],pos[a[i]]=i;
dp[0]=1;
for(int i=1;i<=n;i++){
dp[i]=dp[i-1];
if(pre[i]!=0&&pre[i]!=i-1) dp[i]=(dp[i]+dp[pre[i]])%mod;
}
cout<<dp[n]<<endl;
return 0;
}
/**
题意:构造首尾已知,中间相邻二进制1的个数相差等于1的数组;
思路:构造,先考虑不满足的情况,分析后直接对a,b进行拆分即可
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
std::vector<int> dfs(int n,int a,int b){
if(n==1) return {a,b};
b^=a;
int step=-1;
for(int i=0;i<n;i++) if(b&(1<<i)) {step=i;break;}
std::vector<int> p=dfs(n-1,0,1);
std::vector<int> q=dfs(n-1,1,(b^(1<<step))>>1);
std::vector<int> vec;
for(int i=0;i<(int)p.size();i++) {
int a=p[i]>>step,b=p[i]&((1<<step)-1);
vec.push_back((a<<(step+1))+b);
}
for(int i=0;i<(int)q.size();i++) {
int a=q[i]>>step,b=q[i]&((1<<step)-1);
vec.push_back((a<<(step+1))+(1<<step)+b);
}
return vec;
}
int main (){
int n,a,b;cin>>n>>a>>b;
if(__builtin_parity(a^b)==0) {
puts("NO");
return 0;
}
std::vector<int> vec = dfs(n,a,b);
puts("YES");
for(auto x:vec) cout<<x<<endl;
return 0;
}