csu 1756(数论+去重)

Prime

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 84  Solved: 12
[Submit][Status][Web Board]

Description

如果a,b的最大公约数是1,说明a,b是一对互素的数,给定你n个数字,希望你找出互素的数的对数

Input

第一行输入一个正整数T,表示数据组数

每组数据第一行输入一个正整数n,表示数字的个数(n<=10000)

接下来一行输入n个正整数,每个数字大小不超过1000。

Output

输出互素的数的对数

Sample Input

1
4
10 9 6 35

Sample Output

3

数字有10000个,暴力肯定要炸,但是数字范围只有 1000 ,那么我们可以去重后计数利用乘法原理再算。这样暴力的话就只有10^6了,1要特判(2016湘潭赛有个题很像)
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int num[1005];
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int tcase,n;
    int a[10005];
    scanf("%d",&tcase);
    while(tcase--){
        memset(num,0,sizeof(num));
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        sort(a+1,a+1+n);
        num[a[1]]++;
        int k=1;
        for(int i=2;i<=n;i++){
            if(a[i]==a[i-1]){
                num[a[i]]++;
                continue;
            }
            a[++k] = a[i];
            num[a[i]]++;
        }
        long long ans=0;
        for(int i=1;i<=k;i++){
            for(int j=1;j<=i;j++){
                if(gcd(a[i],a[j])==1&&a[i]!=a[j]){
                    ans+=(long long)num[a[i]]*num[a[j]];
                }else if(a[i]==1&&num[a[i]]>1){
                    ans+=num[a[i]]*(num[a[i]]-1)/2;
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-12-25 12:12:22

csu 1756(数论+去重)的相关文章

csu 1756: Prime

1756: Prime Submit Page   Summary   Time Limit: 3 Sec     Memory Limit: 128 Mb     Submitted: 281     Solved: 69 Description 如果a,b的最大公约数是1,说明a,b是一对互素的数,给定你n个数字,希望你找出互素的数的对数 Input 第一行输入一个正整数T,表示数据组数 每组数据第一行输入一个正整数n,表示数字的个数(n<=10000) 接下来一行输入n个正整数,每个数字大

csu 1392 Number Trick (数论)

题意:输入一个数x 从小到大输出所有满足 (k*leny+y)*x=y*10+k 的 k*leny+y 思路:因为x 为浮点数 所以等式两边都要乘 1e4 将等式化为 k(leny*x-1)*1e4=y(1e5-x*1e4) 可以通过枚举 len k 来求出y是否存在 存在时位数又是否符合条件 这题坑点略多 还好问了凯神 不然坑死= = 首先 转化 x时要注意浮点误差 x=(int)(lx*10000+0.5); 其次 由于等式两边有可能为0 求出的y也就为0 即该数为个位数时 所以对这种情况进

csu 1320 (数论)

卡特兰数的应用 #include<cstdio> #include<cstring> #include<iostream> #define ll long long #define mod 1000000007 using namespace std; ll a[10000+10]; int main() { int n; int i,j; a[0]=1; for(i=1;i<=10000;i++) { for(j=0;j<i;j++) { a[i]=(a[

CSU 1113 Updating a Dictionary(map容器应用)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为一个关键字对应一个值,输入格式如下: {a:3,b:4,c:10,f:6} {a:3,c:5,d:10,ee:4}冒号前面的表示关键字,冒号后面的数字表示值,关键字由小写字母组成.现在让你判断,如果新的字典相对于原来的字典有新增的关键字以以下格式输出 :+key1,key2,....如果新的字典相对

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

NKOJ1236 a^b (数论定理的应用)

          a^b 对于任意两个正整数a,b(0<=a,b<10000)计算a b各位数字的和的各位数字的和的各位数字的和的各位数字的和. Input 输入有多组数据,每组只有一行,包含两个正整数a,b.最后一组a=0,b=0表示输入结束,不需要处理. Output 对于每组输入数据,输出ab各位数字的和的各位数字的和的各位数字的和的各位数字的和. Sample Input 2 3 5 7 0 0 Sample Output 8 5 思路: 数论定理:任何数除以9的余数等于各位数的和除

将MySQL去重操作优化到极致之三弹连发(一):巧用索引与变量

元旦假期收到阿里吴老师来电,被告知已将MySQL查重SQL优化到极致:100万原始数据,其中50万重复,把去重后的50万数据写入目标表只需要9秒钟.这是一个惊人的数字,要知道仅是insert 50万条记录也需要些时间的.于是来了兴趣,自己实验.思考.总结做了一遍. 一.问题提出        源表t_source结构如下:item_id int,created_time datetime,modified_time datetime,item_name varchar(20),other var

CSU 1111: 三家人【有趣的思维题】

1111: 三家人 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 2241  Solved: 874 [Submit][Status][Web Board] Description 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列,便出了90元.请问这笔钱如何分给A.B 二位太太较为恰当?A 应得多少元?90/(5+4)*5=$50

CSU 1112: 机器人的指令【模拟题】

1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1858  Solved: 682 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的动作.输入保证i 是一个正整数,且不超过之前执行指令数 In