SDUT 3258 Square Number(2015年山东省第六届ACM大学生程序设计竞赛)
来源:互联网 发布:胶南网络推广招聘信息 编辑:程序博客网 时间:2024/05/17 23:23
Square Number
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
In mathematics, a square number is an integer that is the square of an integer. In other words, it is the product of some integer with itself. For example, 9 is a square number, since it can be written as 3 * 3.
Given an array of distinct integers (a1, a2, ..., an), you need to find the number of pairs (ai, aj) that satisfy (ai * aj) is a square number.
输入
The first line of the input contains an integer T (1 ≤ T ≤ 20) which means the number of test cases.
Then T lines follow, each line starts with a number N (1 ≤ N ≤ 100000), then N integers followed (all the integers are between 1 and 1000000).
输出
For each test case, you should output the answer of each case.
示例输入
1 5 1 2 3 4 12
示例输出
2
分析:
判断两个数的乘积是否为平方数,需要先将该数字拆分多个素数的平方数的形式,例如:
12 = 2*2*3
3 = 3
这样2*2就可以忽略不看,因为它已经是平方数,只需要找3与12的质因数3配成平方数即可.
先打一个1000的素数表,因为最大数据是1e6,所以取根号大小就行。然后根据素数表打一个平方数表。
代码如下:
#include <stdio.h>#include <string.h>#define MAX 1000010int pri[1010];int dp[200];int vis[MAX];int amount=0;void init(){for(int i=2;i<=1000;i++){//素数打表 for(int j=i+i;j<=1000;j+=i){if(!pri[j])pri[j]=1;}}//平方数打表 for(int i=2;i<=1000;i++)if(!pri[i])dp[amount++]=i*i;}int main(){int T,n;int t;int i,j;init();scanf("%d",&T);while(T--){memset(vis,0,sizeof(vis));int ans=0;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&t);for(j=0;j<amount;j++){if(t%dp[j]==0){while(t%dp[j]==0)t/=dp[j];}}ans+=vis[t];//除去平方因数后的值 ,有多少个该平方因数的值就可以组成多少对 vis[t]++;}printf("%d\n",ans);}return 0;}
0 0
- SDUT 3258 Square Number(2015年山东省第六届ACM大学生程序设计竞赛)
- SDUT 3262 Colorful Cupcakes (2015年山东省第六届ACM大学生程序设计竞赛)
- 山东省第六届ACM大学生程序设计竞赛-Square Number(完全平方数)
- SDUT3258Square Number(2015年山东省第六届ACM大学生程序设计竞赛)
- SDUT 3258 山东省第六届ACM程序设计大赛——H Square Number
- SDUT 2151 Phone Number 2010年山东省第一届ACM大学生程序设计竞赛
- SDUT 2157 Greatest Number (二分) 2010年山东省第一届ACM大学生程序设计竞赛
- sdut 3258 Square Number(山东声第六届ACM程序设计竞赛)
- SDUT 2163 Identifiers 山东省第二届ACM大学生程序设计竞赛
- 2015年山东省第六届ACM大学生程序设计竞赛-B-Lowest Unique Price
- 山东省第六届ACM竞赛 山东理工SDUT3258 Square Number
- 山东省第一届ACM大学生程序设计竞赛--Greatest Number--二分
- SDUT 2879 Colorful Cupcakes (2014年山东省第五届ACM大学生程序设计竞赛)
- 2017年山东省第八届ACM大学生程序设计竞赛 C fireworks(sdut 3895) 逆元求组合数
- 2017年山东省第八届ACM大学生程序设计竞赛 B Quadrat(sdut 3894) 打表找规律
- SDUT 2410 Mine Number 2012年山东省第三届ACM大学生程序设计竞赛题
- 【第七届山东省ACM竞赛】Square Number
- Phone Number 2010年山东省第一届ACM大学生程序设计竞赛
- 使用stringstream对象简化类型转换
- 如何在Eclipse中加载Android源码
- FZU 2232 炉石传说(二分图最大匹配)
- System.out.println,system.out.print,system.out.printf的区别
- Spring之乐观锁简单理解和实例
- SDUT 3258 Square Number(2015年山东省第六届ACM大学生程序设计竞赛)
- IP、子网掩码
- 关于UILabel的多行显示 UILabel numberOfLines
- Dempster-Shafer Evidence Theory
- HTTP状态码
- IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”)
- JS移动客户端--触屏滑动事件
- EasyCamera开源项目介绍
- ajax,get时请求异步缓存