• HDU5514 Frogs


     1 /*
     2  HDU5514 Frogs
     3  http://acm.hdu.edu.cn/showproblem.php?pid=5514
     4  容斥原理
     5  *
     6  *
     7  */
     8 #include <cstdio>
     9 #include <cmath>
    10 #include <algorithm>
    11 //#define test
    12 using namespace std;
    13 const long long Nmax=1e5;
    14 long long n,m,a[Nmax];
    15 long long book[Nmax];
    16 long long p[Nmax];
    17 int cnt;
    18 long long num[Nmax];
    19 long long gcd(long long a,long long b)
    20 {
    21     if(b==0LL)
    22         return a;
    23     return gcd(b,a%b);
    24 }
    25 
    26 int main()
    27 {
    28     long long t;
    29     #ifdef test
    30     while(1)
    31     {
    32         long long a,b;
    33         scanf("%lld%lld",&a,&b);
    34         printf("%lld
    ",gcd(a,b));
    35     }
    36     #endif
    37     scanf("%lld",&t);
    38     for(long long ttt=1;ttt<=t;ttt++)
    39     {
    40         scanf("%lld%lld",&n,&m);
    41         int flag=0;
    42         for(long long i=1;i<=n;i++)
    43         {
    44             scanf("%lld",&a[i]);
    45             a[i]=gcd(a[i],m);
    46             if(a[i]==1)
    47                 flag=1;
    48         }
    49         if(flag)
    50         {
    51             long long ans=(m-1LL)*m/2LL;
    52             printf("Case #%lld: ",ttt);
    53             printf("%lld
    ",ans);
    54             continue;
    55         }
    56         long long ans=0LL;
    57         cnt=0;
    58         for(int i=2;i*i<=m;i++)
    59         {
    60             if(m%i)
    61                 continue;
    62             p[++cnt]=i;
    63             if(i*i!=m)
    64                 p[++cnt]=m/i;
    65         }
    66         sort(p+1,p+1+cnt);
    67         for(int i=1;i<=cnt;i++)
    68             book[i]=num[i]=0;
    69         for(int i=1;i<=n;i++)
    70         {
    71             for(int j=1;j<=cnt;j++)
    72                 if(p[j]%a[i]==0)
    73                     book[j]=1;
    74         }
    75         for(int i=1;i<=cnt;i++)
    76         {
    77             if(book[i]!=num[i])
    78             {
    79                 long long tmp=m/p[i];
    80                 ans+=tmp*(tmp-1LL)/2LL*p[i]*(book[i]-num[i]);
    81                 tmp=book[i]-num[i];
    82                 for(int j=i+1;j<=cnt;j++)
    83                     if(p[j]%p[i]==0)
    84                         num[j]+=tmp;
    85             }
    86         }
    87 
    88         printf("Case #%lld: ",ttt);
    89         printf("%lld
    ",ans);
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    C++学习的小Tips
    搭建一个简单struts2框架的登陆
    Eclipse启动tomcat,http://localhost:8080/无法访问的解决方法
    JAVA解析XML的四种方法
    正则表达式学习笔记(附:Java版示例代码)
    Windows下几个常用的和进程有关的命令
    Java网络编程学习
    项目新增内存表优化软件速度
    Android三种消息提示
    数字手写识别——Java实现KNN算法
  • 原文地址:https://www.cnblogs.com/BBBob/p/6624856.html
Copyright © 2020-2023  润新知