几道简单ACM题的解答----1
来源:互联网 发布:淘宝开店代销货源 编辑:程序博客网 时间:2024/06/03 16:16
从这篇开始,发一些简单的ACM题及其解答,都是这几天做的。
题目:
破解平方数Problem
给出m个数b1, b2,..., bm,每个数的素数因子都在前t个素数之内,任务是寻找这m个数的非空子集的个数x,使得每个子集的乘积都是一个完全平方数。例如t=3,则前3个素数为2, 3, 5。m=4,这4个数为9, 20, 500, 3, 每个数的素因子都是在前3个素数内,则有x=3个非空子集合{9}, {20, 500}, {9, 20, 500},满足每个集合内的数的乘积是一个完全平方数,输出这样的集合的个数。
Input
每组测试数据的第一行为两个正整数t, m(1 ≤ t ≤ 100, 1 ≤ m ≤ 100) 第二行为m个数, 1 <= bi <= 109 处理至文件结束
Output
每行输出一个整数x,对应每组测试数据
Sample Input
3 4
9 20 500 3
Sample Output
3
我的答案:
#include<stdio.h>#include<math.h>#define MAX 100#define SUCCESS 1#define FAILURE 0void makePrime(int prime[],int t);void makeMatrix(char matrix[],int m,int i);int test(int data[],int prime[],char matrix[],int m,int t);int isPrime(int prime[],int length,int testNum);void addArray(int array[],int num,int prime[],int t);int main(){int t,m;int prime[100];char matrix[100];int data[100];int sum = 0;int i;prime[0] = 2;scanf("%d%d",&t,&m);for(i = 0;i < m;i++)scanf("%d",&data[i]);/*for(i = 0;i < m;i++)printf("%d\t",data[i]);*/makePrime(prime,t);for(i = 1;i < (int)pow(2,m);i++){makeMatrix(matrix,m,i);if(test(data,prime,matrix,m,t) == SUCCESS)sum++;}printf("%d\n",sum);return 0;}void makePrime(int prime[],int t){int i = 1;int j;//int k;for(j = 3;i < t;j += 2)if(isPrime(prime,i,j)){++i;prime[i - 1] = j;}/*for(k = 0;k < t;k++){printf("%d\t",prime[k]);}*/}void makeMatrix(char matrix[],int m,int i){//化成二进制的函数m--;for(;m >= 0;m--){matrix[m] = i % 2 + '0';i /= 2;//putchar(matrix[m]);}//putchar('\n');}int test(int data[],int prime[],char matrix[],int m,int t){int i;int array[MAX] = {0};/*printf("testing ");for(i = 0;i < m;i++)putchar(matrix[i]);putchar('\n');*///printf("m == %d\n",m);for(i = 0;i < m;i++)if(matrix[i] == '1')addArray(array,data[i],prime,t);/*for(i = 0;i < m;i++)printf("%3d",array[i]);*/for(i = 0;i < m;i++){if(array[i] % 2 != 0)return FAILURE;}return SUCCESS;//为什么对于多个1就没用了?}int isPrime(int prime[],int length,int testNum){int i;for(i = 0;i < length;i++){if(testNum % prime[i] == 0)return 0;}return 1;}void addArray(int array[],int num,int prime[],int t){int i;for(i = 0;i < t;i++){while(num % prime[i] == 0){array[i]++;//printf("%d++\n",i);if(num >= prime[i])num = num / prime[i];//else//break;}}}
PS:我感觉这个题目的数据是有问题的,如果真的测试数据t和m到了100的话,那么程序会测试2的100次方个数据,这是个相当大的数据。
- 几道简单ACM题的解答----1
- 几道简单ACM题的解答----2
- 几道简单ACM题的解答----3
- 几道简单ACM题的解答----4
- 几道简单ACM题的解答----5
- 几道简单ACM题的解答----6
- 几道简单ACM题的解答----7
- 几道简单ACM题的解答----8
- 关于一笔画问题的简单解答ACM中的题(1)
- 几道java题的解答
- 几道算法解答
- 关于ACM练习第八题的思考和解答
- 哎,心碎博弈论,做了几道十分简单的。 ACM b博弈
- [编程题]确定两串乱序同构的几种解答方式
- 一些简单的acm题
- ACM数读问题的解答
- 几道浙大acm题代码
- 简单的几道算法题_AboutDP
- CentOS中文显示方格问题解决 .
- 《c陷阱与缺陷》读书笔记
- Android 获取手机短信
- 解决mysql连接慢和开启skip-grant-tables后访问控制失控解决方法
- Android emulator 常用快捷键
- 几道简单ACM题的解答----1
- 队列中取最大值操作问题
- virtual与override--不断更新
- c++ 指向 类成员函数(thiscall)的 函数指针
- qwt移植到s3c6410
- PHP使用zlib扩展实现页面GZIP压缩输出
- oracle用户管理
- js 回到顶部
- 这是oracle数据库里的东西,表示什么意思啊?谁能帮忙解释一下?