题目(狼堡的密码):
【题目描述】
很不幸,虽然大家很努力,可羊羊们还是被灰太狼抓进了狼堡。不过,由于灰太狼太累了,准备第二天再吃羊。夜深了,灰太狼夫妇正呼呼大睡。羊羊们偷偷解开了绳子,准备逃跑。可灰太狼早有准备,把窗子封得严严实实,唯一的门上装有密码锁。不甘被吃的羊羊们决定试一试密码。
狼堡的密码是这样的:显示屏上有n 个数,有的数出现了奇数次,有的数出现了偶数次,逃出的密码就是分别输入出现了奇数次的数的所有正因数的个数
【输入】
第1 行,一个正整数n,表示有n个数。
第2~n+1 行,每行一个正整数x(x≤100000)
【输出】
若干行,每行两个整数,用一个空格隔开。第一个是出现了奇数次的数,第二个数是它正因数的个数。按第一个数从小到大输出
【样例输入】
10
1
2
2
3
3
3
4
4
4
4
【样例输出】
1 1
3 2
【数据范围】
30%的数据满足:n≤500;
50%的数据满足:n≤1000;
100%的数据满足:n≤10000。
分析:
1.暴力枚举(可过)
2.有一个结论,如果整数 a = a1 ^ p1 * a2 ^ p2 * ... * ak^pk,那么 a 的因数
个数为(p1 + 1) * (p2 + 1) * ... * (pk + 1),a1 ... ak 为质数,那么只需
要求出 a 的所有质因数和对应的 p 即可
代码:
法一:
#include<bits/stdc++.h>
using namespace std;
int n,w[100010];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
w[x]++;
}
for(int i=1;i<=100000;i++){
if(w[i]%2==1){
int ans=0;
for(int j=1;j<=sqrt(i);j++){
if(i%j==0) ans+=2;
if(j==sqrt(i)) ans--;//注意:如果j*j就等于i,那么只相当于1个因子(辣鸡楼主就是这样挂的)
}//暴力枚举出i的因子个数
printf("%d %d\n",i,ans);
}
}
return 0;
}
法二:
#include<cstdio>
#include<cstring>
using namespace std;
int total(int i){
int tmp=1;
int j=2;
while(j<=i){
int t=0;
while (!(i%j)){
i/=j;t++;
}
tmp*=(t+1);
++j;
}
return tmp;
}
int main(){
int n;
scanf("%d", &n);
int a[100100];
memset(a,0,sizeof(a));
int x;
for(int i=0;i<n;++i){
scanf("%d", &x);
a[x]++;
}
for(int i=1;i<=100000;++i){
if (a[i] & 1)
printf("%d %d\n", i, total(i));
}
return 0;
}