zoukankan      html  css  js  c++  java
  • 1161

    1161 - Extreme GCD
    Time Limit: 1 second(s) Memory Limit: 32 MB

    All of you know that GCD means the greatest common divisor. So, you must have thought that this problem requires finding some sort of GCD. Don't worry, you are absolutely right!

    Given N positive integers, not necessarily distinct, how many ways you can take 4 integers from the N numbers such that their GCD is 1.

    Input

    Input starts with an integer T (≤ 20), denoting the number of test cases.

    Each case starts with an integer N (4 ≤ N ≤ 10000). The next line contains N integers separated by spaces. The integers will be positive and not greater than 10000.

    Output

    For each case, print the case number and the number of ways you can take the integers as mentioned above.

    Sample Input

    Output for Sample Input

    3

    4

    2 4 6 1

    5

    1 2 4 6 8

    10

    12 46 100 131 5 6 7 8 9 10

    Case 1: 1

    Case 2: 4

    Case 3: 195


    SPECIAL THANKS: JANE ALAM JAN (SOLUTION, DATASET)
    思路:容斥原理;
      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<iostream>
      4 #include<string.h>
      5 #include<queue>
      6 #include<stack>
      7 #include<map>
      8 #include<math.h>
      9 using namespace std;
     10 typedef long long LL;
     11 bool prime[10005]= {0};
     12 int ans[10005];
     13 int aa[10005];
     14 int bt[10005];
     15 int cc[10005]= {0};
     16 bool dd[10005]= {0};
     17 queue<int>que;
     18 int main(void)
     19 {
     20         int i,j,k;
     21         for(i=2; i<200; i++)
     22         {
     23                 for(j=i; i*j<=10000; j++)
     24                 {
     25                         prime[i*j]=true;
     26                 }
     27         }
     28         int cnt=0;
     29         for(i=2; i<=10000; i++)
     30         {
     31                 if(!prime[i])
     32                 {
     33                         ans[cnt++]=i;
     34                 }
     35         }int d;
     36         cin>>d;int s;
     37         for(s=1;s<=d;s++)
     38         {       cin>>k;
     39                 memset(bt,0,sizeof(bt));
     40                 for(i=0; i<k; i++)
     41                 {
     42                         scanf("%d",&aa[i]);
     43                 }
     44                 for(i=0; i<k; i++)
     45                 {
     46                         int nn=aa[i];
     47                         int t=0;
     48                         int flag=0;
     49                         while(nn>1)
     50                         {
     51                                 if(flag==0&&nn%ans[t]==0)
     52                                 {
     53                                         flag=1;
     54                                         que.push(ans[t]);
     55                                         nn/=ans[t];
     56                                 }
     57                                 else if(nn%ans[t]==0)
     58                                 {
     59                                         nn/=ans[t];
     60                                         flag=1;
     61                                 }
     62                                 else
     63                                 {
     64                                         flag=0;
     65                                         t++;
     66                                 }
     67                         }
     68                         if(nn>1)
     69                         {
     70                                 que.push(nn);
     71                         }
     72                         int xx=0;
     73                         while(!que.empty())
     74                         {
     75                                 cc[xx++]=que.front();
     76                                 que.pop();
     77                         }
     78                         int x;
     79                         int y;
     80                         for(x=1; x<=(1<<xx)-1; x++)
     81                         {
     82                                 int ak=1;
     83                                 int vv=0;
     84                                 for(j=0; j<xx; j++)
     85                                 {
     86                                         if(x&(1<<j))
     87                                         {
     88                                                 vv++;
     89                                                 ak*=cc[j];
     90                                         }
     91                                 }
     92                                 bt[ak]+=1;
     93                                 if(vv%2)
     94                                         dd[ak]=true;
     95                         }
     96                 }
     97                 LL sum=0;
     98                 LL sum1=0;
     99                 for(i=2; i<=10000; i++)
    100                 {
    101                         if(bt[i]>=4)
    102                         {
    103                                 LL nn=(LL)bt[i]*(LL)(bt[i]-1)*(LL)(bt[i]-2)*(LL)(bt[i]-3)/24;
    104                                 if(dd[i])
    105                                         sum+=nn;
    106                                 else sum-=nn;
    107                         }
    108                 }
    109                 sum1=(LL)k*(LL)(k-1)*(LL)(k-2)*(LL)(k-3)/24;
    110                 sum1-=sum;printf("Case %d: ",s);
    111                 printf("%lld
    ",sum1);
    112         }
    113         return 0;
    114 }
     
    油!油!you@
  • 相关阅读:
    《陶哲轩实分析》习题10.4.3
    陶哲轩实分析定理10.1.3:导数运算的积法则和商法则
    《数学分析新讲》_张筑生,12.5节:隐函数定理(1)
    《数学分析新讲》_张筑生,12.5节:隐函数定理(1)
    《陶哲轩实分析》定理10.1.15:导数的链法则
    我的博客园的CSS和html设置
    陶哲轩实分析定理10.1.3:导数运算的积法则和商法则
    关于Eclipse中一个错误排查总结
    RMI, Dynamic Proxies, and the Evolution of Deployment
    Java垃圾回收机制浅析
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5494847.html
Copyright © 2011-2022 走看看