WUST I could run!(素数筛法+欧拉函数的运用+稍微的递推)

来源:互联网 发布:乐视电视没网络能看吗 编辑:程序博客网 时间:2024/06/03 14:56

I could run!

Time Limit: 1 Sec  Memory Limit: 128 MB  64bit IO Format: %lld
Submitted: 77  Accepted: 23
[Submit][Status][Web Board]

Description

ahm001 is running a function but always get TLE.
long long calc (int n){
  long long res=0;
  for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    {
      if (gcd(i,j)==1) res+=j;
    }
  return res;
}
But he just can't get an AC.
Can you help him?

Input

The first line is a number T,indicating the number of the test cases.
For each test cases,there's a number n(n<=10^6).

Output

For each test case,output the value of calc(n) for a line.

Sample Input 



 3
 1
 2
 3

Sample Output

0
2
8

题解:

这题是我很久以前做的题了,不过突然想起来这有一个很重要的知识点,当时wh学长讲的很好很清楚,一下就做出来了,学长有点久远了,所以写一个题解,就是素数筛法打表和欧拉函数的运用,gcd为最小公约数,欧拉函数:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为小于等于x的素数,设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值,若n为质数则欧拉函数值为n-1,这里用素数筛法打表同时可以求欧拉函数,节省了很多时间

代码:

#include<stdio.h>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int N=1e6+5;int a[78499],p[N],b[N];//a保存素数,p保存是否遍历过该节点,b保存欧拉函数的值long long f[N];//求得结果void ini()//素数打表+求欧拉函数{    int i,j,k=0;    memset(p,0,sizeof(p));    memset(b,0,sizeof(b));    for(i=2;i<=N-5;i++)    {        if(!p[i])        {            a[k]=i;            k++;            for (j=i*2;j<=N-5;j+=i)            {                if(!p[j])                    b[j]=j;                b[j]=b[j]-b[j]/i;//打表的同时完成求欧拉函数                p[j]=1;            }        }    }}int main(){    long long i,j,k,n,t;    memset(f,0,sizeof(f));    ini();    for (i=2;i<=1000000;i++)    {        if(!p[i])//如果数字为素数,观察式子,由于该数字与之前每一个数字都互质,多出来的数为n(n-1),n为当前数字,是素数,n-1为j从i+1到n得出为n-1趟            f[i]=f[i-1]+i*(i-1);        else//为合数,不用再加一组素数,观察所求式子,多出来该数字n与与n互质的素数个数(该点的欧拉函数)的乘积            f[i]=f[i-1]+i*b[i];    }    while(scanf("%lld",&t)!=EOF)    {        while(t--)        {            scanf("%lld",&n);            printf("%lld\n",f[n]);        }    }return 0;}



原创粉丝点击