so easy
Accepts: 512
Submissions: 1601
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
已知一个包含 n 个元素的正整数集合 S,设 f(S) 为集合 S 中所有元素的异或(XOR)的结果。 如:S={1,2,3}, 则 f(S)=0。 给出集合 S,你需要计算 将所有 f(s) 进行异或后的值, 这里 s⊆S.
输入描述
多组测试数据。第一行包含一个整数 T(T≤20) 表示组数。 每组测试数据第一行包含一个数 n(1≤n≤1,000) 表示集合的大小,第二行为 n 的数表示集合元素。第 i(1≤i≤n) 个数 0≤ai≤1000,000,000 且数据保证所给集合中没有重复元素。
输出描述
对于每组测试数据,输出一个数,表示将所有的 f(s) 的异或之后的值。
输入样例
1 3 1 2 3
输出样例
0
Hint
样例中,S={1,2,3}, 它的子集有∅, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}
题解:我们考虑集合中的每个数x对答案的贡献。 设集合有n个数,则包含x的子集个数有2^(n-1)个。 那么当n > 1时,x出现了偶数次,所以其对答案的贡献就是0;当 n = 1时,其对答案的贡献是 x。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define LL __int64 const int maxm=1e5+10; int a[maxm]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } if(n==1) { printf("%d\n",a[0]); } else { printf("0\n"); } } return 0; }
xiaoxin juju needs help
Accepts: 150Submissions: 966Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/65536 K (Java/Others)题解:首先,如果不止一个字符出现的次数为奇数,则结果为0。 否则,我们把每个字符出现次数除2,也就是考虑一半的情况。 那么结果就是这个可重复集合的排列数了。 设该集合有n个数,第i个数出现次数为ai,那么结果就是 fact(n)/fact(a1)/fact(a2)/..../fact(an)。问题描述xiaoxin巨从小就喜欢字符串,六年级的时候他就知道了什么是回文串。这时,xiaoxin巨说到:如果一个字符串 S 是回文串,那么该字符串从前往后看和从后往前看是一样一样的。 六年级的暑假,xiaoxin很快就做完了暑假作业,然后到腾讯做起了实习生。这日,leader给了xiaoxin一个字符串,请xiaoxin帮忙写一个函数来生成所有可能的回文串,可以任意改变字符串的顺序但是不可以扔掉某个字符。并且leader告诉xiaoxin,每生成一个不一样的回文串就可以得到一颗西瓜糖。 请你帮忙计算xiaoxin的leader最多需要买多少颗西瓜糖呢?
输入描述多组测试数据。第一行包含一个整数 T(T≤20) 表示组数。每组测试数据给出一个只包含小写字母的字符串 S(1≤length(S)≤1,000)输出描述对于每组测试数据,输出一个数, 表示leader需要买的西瓜糖的个数,结果对 1,000,000,007 取模。
输入样例3 aa aabb a输出样例1 2 1#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define LL __int64 const LL mod=1e9+7; const LL maxm=1e5+10; char s[maxm]; LL x[maxm]; LL quickmod(LL a,LL b) { LL sum=1; while(b) { if(b&1) sum=(sum*a)%mod; b>>=1; a=(a*a)%mod; } return sum; } int main() { int t; scanf("%d",&t); while(t--) { LL n; scanf("%I64d",&n); scanf("%s",s); LL len=strlen(s); sort(s,s+len); LL cnt=0; LL ans=1; for(LL i = 1; i < len; i++) { if(s[i] == s[i-1]) { ans ++; } else { x[cnt++] = ans; ans = 1; } } x[cnt++] = ans; LL ok=0; for(LL i=0; i<cnt; i++) { if(x[i]&1) { ok++; } } if(ok>=2) { printf("0\n"); continue; } len=0; for(LL i = 0; i < cnt; i++) { if(x[i] % 2) { x[i] = (x[i] - 1) / 2; } else { x[i] /= 2; } len += x[i]; } LL sum1=1; for(LL i=1; i<=len; i++) { sum1=(sum1*i)%mod; } LL sum2=1; for(LL i = 0; i < cnt; i++) { for(LL j = 1; j <= x[i]; j++) { sum2 = (sum2* j) % mod; } } printf("%I64d\n",(sum1*(quickmod(sum2,mod-2)%mod))%mod); } return 0; }