A题,直接水题啦。直接用map统计一下给定的字符串出现的字母的种类。。然后判断奇偶。
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iostream>
using namespace std;
int main(){
string name;
int cnt = 0;
cin>>name;
map<char , int>hash;
for(int i = 0; i !=name.size(); i ++){
if(hash.find(name[i])!= hash.end()){
continue;
}
else{
hash[name[i]] = 1;
cnt ++;
}
}
if(cnt%2){
puts("IGNORE HIM!");
}
else
puts("CHAT WITH HER!");
return 0;
}
B题,直接打表。由于最大的数字只有1000000 ,打表的效率nlogn的。然后直接枚举算出来,是1000000,所以复杂度为1000000log1000000
#include <cstdio>
#include <cstring>
typedef long long LL;
const int maxn = 1000000;
const int mod = 1073741824;
int d[maxn+5] ;
int main(){
for(int i = 1; i <= maxn ; i ++){
for(int j = i ; j <= maxn ; j +=i){
d[j] = (d[j] + 1)%mod;
}
}
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
int ans = 0;
for(int i = 1; i <= a ; i ++){
for(int j= 1; j <= b; j ++){
for(int k=1 ; k <= c ; k++){
ans = (ans + d[i*j*k])%mod;
}
}
}
printf("%d\n" , ans%mod);
}
C题,比赛的时候只推出了一半。。。只证明到n为奇数的时候答案肯定是n*(n-1)*(n-2),然后偶数的时候答案在n*(n-1)*(n-2)/2 ,n*(n-1)*(n-3)/gcd(n, n-3)中(忽略了, (n-1)*(n-2)*(n-3))。
对于n=1,2,3可以先特判一下。。对于n>3的如下。。这里n与n-1的最大公约数必定是1.证明方法可以参考下面的方式。
先考虑n = 2*k+1,那么2*k+1, 2*k , 2*k-1,两两之间
的最大公约数只有1,证明如下:
设d为2*k+1,2*k-1的最大公约数,显然2*k+1与2*k-1可以被d整除
所以也就是(2*k-1 + 2)/d ,也就得到2可以整除d,d只可能为1或者2
显然d不可能为2.
这样n为奇数的时候结果就直接出来了。。
考虑n = 2*k+2的时候,
可以分类讨论
1.在所选的三个数字中必定不含n的,那么也就是
原问题在n-1条件下的答案,显然为:(n-1)*(n-2)*(n-3).
对于包含n的,
先考虑选择了n-1的,对于最后一个数字:
如果是n-2,那么答案就在n*(n-1)*(n-2)/2中
如果是n-3, 那么需要考虑n%3==0?是否成立,如果成立答案就可能是
n*(n-1)*(n-3)/gcd(n,n-3)
如果是n-4,那么可证n*(n-1)*(n-4)<n*(n-1)*(n-2)
如果是n-5, 可证n*(n-1)*(n-5)(这里可证公约数必定为1)< (n-1)*(n-2)*(n-3) 直接展开就好。。。
然后可以直接归纳得到在选择n-1的时候第三个数就在n-2, n-3中
如果不选择n-1,可以同样证明。这里不再赘述。
#include <cstdio>
#include <cstring>
typedef long long LL;
LL gcd(LL a, LL b){
return b==0? a : gcd(b,a%b);
}
LL max(LL a, LL b){
return a > b ? a : b;
}
int main(){
LL n;
LL ans = 0;
scanf("%I64d", &n);
if(n==1)
printf("1\n");
else if(n==2)
printf("2\n");
else if(n==3)
printf("6\n");
else{
if(n%2==1)
printf("%I64d\n",n*(n-1)*(n-2));
else{
LL tmp;
ans = n*(n-1)*(n-2)/gcd(n*(n-1), n-2);
tmp = (n-1)*(n-2)*(n-3);
ans = max(ans, tmp);
tmp = n*(n-1)*(n-3)/gcd(n*(n-1), n-3);
ans = max(ans, tmp);
printf("%I64d\n", ans);
}
}
return 0;
}
D题,比赛的时候完全没想法,看完解题报告还是没有太明白。。E题,表示不会。。看了解题报告后原来用后缀自动机。。。