数学上来先打表

来源:互联网 发布:川农在线网络教育平台 编辑:程序博客网 时间:2024/06/05 20:29

数学上来先打表
Time Limit: 1000 Memory Limit: 65536
Description

给定一个函数 ldq(x) = i^(i*i/7),现在 PBH 想知道区间 [l, r] 之间所有素数的 ldq(i) 的和,即 ldq(l) + ldq(l+1) + … + ldq(r-1) + ldq(r)。

其中 i*i/7 中的除法为整数除法。

[l, r] 区间内加和,仅当 i 为素数时才累加 ldq(i)。
Input

输入两个整数 l, r (1 <= l <= r <= 10000)。
Output

输出一个整数,表示答案,最终结果对 7 取模。
Sample Input

1 3

Sample Output

4

以下为TLE代码,就是很正常的写法(这样写百分百超时,当时不会高效算法)

```#include <bits/stdc++.h>using namespace std;int is_prime[10005],prime[10005];void sieve()//筛法{    int i,j;    memset(is_prime,0,sizeof(is_prime));    is_prime[1]=is_prime[0]=1;    int p=0;    for(i=2; i<=10005; i++)    {        if(!is_prime[i])            prime[p++]=i;        for(j=i*2; j<=10005; j+=i)        {            is_prime[j]=1;        }    }}int f(int i){    int x=i*i/7;    int sum=1;    while(x)    {        sum*=i;        sum%=7;        x--;    }    return sum;}int main(){    sieve();    int n,m;    while(~scanf("%d %d",&n,&m))    {        int sum=0;        for(int i=n;i<=m;i++)        {            if(!is_prime[i])            {                sum+=f(i);                sum%=7;            }        }        printf("%d\n",sum);    }}

以下为AC代码

#include <bits/stdc++.h>using namespace std;int is_prime[10005],prime[10005];void sieve(){    int i,j;    memset(is_prime,0,sizeof(is_prime));    is_prime[1]=is_prime[0]=1;    for(i=2; i<=10005; i++)    {        if(!is_prime[i])        for(j=i*2; j<=10005; j+=i)        {            is_prime[j]=1;        }    }}long long int f(long long a,long long b)//quick幂{    long long sum=1;    a%=7;    while(b)    {        if(b&1)            sum*=(a%7);        b>>=1;        a*=(a%7);    }    return sum;}int main(){    sieve();    int n,m;    while(~scanf("%d %d",&n,&m))    {        int sum=0;        for(int i=n;i<=m;i++)        {            if(!is_prime[i])            {                sum+=f(i,i*i/7);                sum%=7;            }        }        printf("%d\n",sum);    }}
原创粉丝点击