zoukankan      html  css  js  c++  java
  • Code(hdu5212)

    Code

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 877    Accepted Submission(s): 348


    Problem Description
    WLD likes playing with codes.One day he is writing a function.Howerver,his computer breaks down because the function is too powerful.He is very sad.Can you help him?

    The function:


    int calc
    {
      
      int res=0;
      
      for(int i=1;i<=n;i++)
        
        for(int j=1;j<=n;j++)
        
        {
          
          res+=gcd(a[i],a[j])*(gcd(a[i],a[j])-1);
          
          res%=10007;
        
        }
      
      return res;

    }
     
    Input
    There are Multiple Cases.(At MOST 10)

    For each case:

    The first line contains an integer N(1N10000).

    The next line contains N integers a1,a2,...,aN(1ai10000).
     
    Output
    For each case:

    Print an integer,denoting what the function returns.
     
    Sample Input
    5
    1 3 4 2 4
     Sample Output
    64
    思路:莫比乌斯反演;
    F[x]表示sum(gcd(a,b))(x|gcd(a,b)),那么我们需要求f(x)(gcd(a,b)==x),那么根据莫比乌斯反演可得
    f(x) = sum(u(y)F(y/x))(x|y);然后答案就是sum(f(x)*(x*(x-1)));所以我们先线性筛出莫比乌斯函数,然后再求每个数
    的因数,复杂度(n*log(n))
     1 #include <iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<string.h>
     5 #include<queue>
     6 #include<set>
     7 #include<math.h>
     8 #include<vector>
     9 typedef long long LL;
    10 using namespace std;
    11 bool prime[10005];
    12 int ak[10005];
    13 LL mul[10005];
    14 LL cnt[10005];
    15 vector<int>vec[10005];
    16 int mod = 10007;
    17 int main(void)
    18 {
    19     int i,j;
    20     int cn = 0;
    21     mul[1] = 1;
    22     for(i = 2; i <= 10000; i++)
    23     {
    24         if(!prime[i])
    25         {
    26             ak[cn++] = i;
    27             mul[i] = -1;
    28         }
    29         for(j = 0; j < cn&&(LL)ak[j]*i<=10000; j++)
    30         {
    31             if(i%ak[j])
    32             {
    33                 prime[i*ak[j]] = true;
    34                 mul[i*ak[j]] = -mul[i];
    35             }
    36             else
    37             {
    38                 prime[i*ak[j]] = true;
    39                 mul[i*ak[j]] = 0;
    40                 break;
    41             }
    42         }
    43     }
    44     int n;
    45     for(i = 1;i <= 10000;i++)
    46     {
    47         for(j = 1;j <= sqrt(i);j++)
    48         {
    49             if(i%j==0)
    50             {
    51                 vec[i].push_back(j);
    52                 if(i/j!=j)
    53                     vec[i].push_back(i/j);
    54             }
    55         }
    56     }
    57     while(scanf("%d",&n)!=EOF)
    58     {   int maxx = 0;
    59         memset(cnt,0,sizeof(cnt));
    60         int i,j;
    61         for(i = 0; i < n; i++)
    62             {scanf("%d",&ak[i]);maxx = max(maxx,ak[i]);}
    63         for(i = 0; i < n; i++)
    64         {
    65             for(j = 0;j < vec[ak[i]].size();j++)
    66             {   int x = vec[ak[i]][j];
    67                 cnt[x]++;
    68             }
    69         }//printf("%lld
    ",cnt[1]);
    70         LL sum = 0;
    71         for(i = 1;i <= maxx;i++)
    72         {
    73             for(j = i;j <= maxx;j+=i)
    74             {
    75                 sum = sum + mul[j/i]*(cnt[j]*cnt[j])*(i*(i-1)%mod)%mod;
    76                 sum%=mod;
    77             }
    78         }
    79         printf("%lld
    ",(sum%mod+mod)%mod);
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/6042650.html
Copyright © 2011-2022 走看看