ACdream oj C - 神奇的%系列一 (水题系列--略坑)



C - 神奇的%系列一

Time Limit: 6000/3000 MS (Java/Others)      Memory Limit: 65536/32768 KB
(Java/Others)

Submit Status

Problem Description

在计算机的世界里,%不是百分比,而是除法取余哟!

比如:

4 % 2 = 0

5 % 3 = 2

给你 2<=N<=100000 个数,a[1],a[2]...a[i]...a[n]。

其中:1<=a[i]<=100000。

问有几个组合 ( a[i] , a[j] ),(其中i!=j,且a[i]>a[j]),

使得 a[i] % a[j] != 0。

Input

输入有多组数据,对于每组数据:(T<=30)

第一行:N(表示N个数)

第二行:N个元素 a[i]

Output

输出有几个组合(a[i],a[j]),使得a[i] % a[j] != 0

Sample Input

3
1 1 1
4
1 2 3 4
5
1 2 2 4 6

Sample Output

0
2
1

这个题那天晚上想了好久,一开始看到这个题觉得可以做,脑海中浮现出来的是最朴素的算法,开始没想那么多,没去计算时间复杂度之类的,几分钟就把程序写好了,提交上去。。。果不奇然,超时了(后面粗略的一算,O(n2)100000*100000,肯定会超时的啊。。。)比赛的时候一定不能乱提交啊!!!!

下面是朴素的算法(暴力)

#include<stdio.h>
#define N 100001
typedef long long LL;
LL a[N];
int main()
{
    int n,i,j;
   while(scanf("%d",&n)!=EOF)
    {
    for(i=1;i<=n;i++)
        scanf("%I64d",&a[i]);
       LL ret2=0;
    for(i=1;i<=n;i++) {
          for(j=i+1;j<=n;j++) {
             if(a[i]>a[j])
                {
                 if(a[i]%a[j]!=0) ret2++;
                }
           else if(a[j]>a[i])
                {
                 if(a[j]%a[i]!=0) ret2++;
                }

            }
        }
       printf("%I64d\n",ret2);
    }
       return 0;
}

直接一个二重循环去搜索!!(这样的效率真心低,以后尽量不要这样写)

后来就一直在想优化的方法,一直想不出啊!!!,当时也想了可以用近似于筛选法的思路,今天看了一下别人的思路,顿时茅塞顿开啊~。

这道题的主要思路是算组合数,题目中问我们是有多少个组合,2个数的总的组合数是Cn 2=n*(n-1)/2;

我们就拿总的组合数减去a[i]/a[j]=0的组合数 ,(中间有组合数相同的情况a[i]/a[i]);

下面是ac的代码;

#include <stdio.h>
#include <string.h>
#define N 100005
int a[N];
long long count[N];//记录a[i] 出现的次数;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(count,0,sizeof(count));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            count[a[i]]++;
        }
        long long sum=((long long )n*(long long )(n-1))/2;//总的组合数;
        for(int i=1;i<=100000;i++)
        {
            if(count[i]==0) continue;//剪枝
            sum-=((count[i])*(count[i]-1))/2;//取余的组合数相等的情况;
            for(int j=i+i;j<=100000;j+=i)
            {
                sum-=count[i]*count[j];
            }
        }
        printf("%lld\n",sum);//这里最坑爹了,不知道是不是他系统的问题,开始用的是I64d,提交了10多次全都是wa,改成lld立马就a了。。。
    }
    return 0;
}

ACdream oj C - 神奇的%系列一 (水题系列--略坑)

时间: 2024-08-25 23:50:50

ACdream oj C - 神奇的%系列一 (水题系列--略坑)的相关文章

nyist oj 540 奇怪的排序(水题)

奇怪的排序 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情.惟独对自然数的理解与人类不一样,它是从右往左读数.比如,它看到123时,会理解成321.让它比较23与15哪一个大,它说15大.原因是它的大脑会以为是32与51在进行比较.再比如让它比较29与30,它说29大. 给定Bill两个自然数A和B,让它将 [A,B] 区间中的所有数按从小到大排序出来.你会认为它如何排序? 输入 第一

nyoj 1208——水题系列——————【dp】

水题系列 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述     给你一个有向图,每条边都有一定的权值,现在让你从图中的任意一点出发,每次走的边的权值必须必上一次的权值大的情况下,问你最多能走几条边? 输入 首先一个n和m,分别表示点的数目和边的数目接下来m行,每行三个值x,y,val,表示x到y有路,其权值为val.(1<n,m,val<10^5,0<x,y<=n) 输出 输出最多有的边的数目 样例输入 3 3 1 2 1 2 3 1 3 1 1 6

FZU OJ 2147 A-B Game (数学水题)

Problem 2147 A-B Game Accept: 827    Submit: 1940 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description Fat brother and Maze are playing a kind of special (hentai) game by two integers A and B. First Fat brother write an integer A on

树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]

题目 大意: 边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值 思路: 最优化问题 一眼树形DP 考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案 再考虑状态转移 dp[u]=MAX(dp[to]+1,siz+dp[to]);siz为枚举子树到以to为节点的子树时之前已遍历的总时间 很明显这个转移过来的dp值的最优化依赖于子树遍历的顺序 所以我们需要找到一种最优的子树遍历顺序来使每个子树得到最优的dp值来更新 我们通过观察可以发现 交换任意两

hdu 5038 水题 但是题意坑

http://acm.hdu.edu.cn/showproblem.php?pid=5038 就是求个众数  这个范围小 所以一个数组存是否存在的状态就行了 但是这句话真恶心  If not all the value are the same but the frequencies of them are the same, there is no mode. 其实应该是这个意思: 当频率最高的有多个的时候, 如果 所有的grade出现的频率都是相等的,那么是没有mode的 否则按照升序 当然

codeforces Gym 100187L L. Ministry of Truth 水题

L. Ministry of Truth Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/K Description Andrey works in the Ministry of Truth. His work is changing articles in newspapers and magazines so that they praise the Party an

碰到日期题就怕的我来写一道水题吧

HDOJ-2005, http://acm.hdu.edu.cn/showproblem.php?pid=2005 20XX系列的水题哈哈,写了二十分钟,就为找到一种比较正常不傻逼的写法... 嗯,学习了一下,闰年的判断可以写成一个接受参数的宏. #define lev(n) (n%4==0&&(n%100!=0||n%400==0)) 然后建立一个二维数组来存储闰年和非闰年的每月天数. int calendar[2][13] = { {0,31,28,31,30,31,30,31,31,

一道超级坑爹的水题(ACdream oj 无耻的出题人)

 A - 无耻的出题人 Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 65536/32768 KB (Java/Others) Submit Status Problem Description 听到X神要参加比赛,只会Fibnacci数的出题人被吓得哭晕在厕所.为了防止X神AK(ALL KILL)比赛题目,无耻的出题人只好在题面上做些手脚(加密).其中一道题的题目描述如下: hjxh dwh v vxxpde,mmo i

Acdream 1111:LSS(水题,字符串处理)

LSS Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Others) SubmitStatistic Next Problem Problem Description Time flies, four years passed, colleage is over. When I am about to leave, a xuemei ask me an ACM  problem, but