ACM长沙赛区 Goldbach——素数筛

本文深入探讨了深度学习在自然语言处理领域的应用,包括词法分析、句法分析、语义分析、文本分类、文本聚类、情感分析等关键任务。详细介绍了基于神经网络的模型如何解决这些问题,并讨论了相关技术的发展趋势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Calculate C(n,m) modulo p. P is prime number.
 

输入

The first line contains a number, T.
Next T lines, n, m, p. n, m, p < 10000.
 

输出

The answer.

示例输入

2
1 2 5
2 1 5

示例输出

3
3

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int s1[1000010];

void get_pri()
{
    memset(s1,0,sizeof(s1));
    int i=0,j=0,k=0,kf;
    kf = sqrt(10000000);
    for(i=2;i<=kf;i++)
    {
        if(s1[i]==0)
        {
            for(j=i*2;j<=1000000;j+=i)//注意里面的j=i*2,不乘2的话会出问题   想一想为什么?
            {
                s1[j]=1;
            }
        }
    }
}

int main()
{
    int i=0,n=0;
    get_pri();
    while(scanf("%d",&n))
    {
        if(n<6)
            break;
        for(i=3;i<=n/2;i++)
        {
            if(s1[i]==0&&s1[n-i]==0&&i<=n-i)
            {
                printf("%d = %d + %d\n",n,i,n-i);
                break;
            }
        }
        if(i>n/2)
        {
            printf("Goldbach's conjecture is wrong.\n");
        }
    }
    return 0;
}

数据过大,记得用哈希
还有两种时间复杂度更低的算法

int pr[MAX] = {2,3,5};
int k = 3;


void is_prime()
{
    int i,j,flag,gad = 2;
    for(i = 7;i <= MAX;i += gad)
    {
        flag = 1;
        gad = 6 - gad;
        for(j = 0;pr[j] * pr[j] <= i;j++)
        {
            if(i % pr[j] == 0)
            {
                flag = 0;
                break;
            }
        }
        if(flag)
            pr[k++] = i;
    }
}

/********************************/
short s[10000010];
int pr[1000000];
int tp = 0;
void sss()
{
    memset(s,0,sizeof(s));

    for(int i = 2;i <= 10000010;i++)
    {
        if(!s[i])
            pr[tp++] = i;
        for(int j = 0;j < tp;j++)
        {
            if(i * pr[j] > 10000000)
                break;
            if(i % pr[j] == 0)
                break;
            s[i * pr[j]] = 1;
        }
    }
}



线性筛法:

int pr[150];
bool s[150];
int k = 0;
void is_pr()
{
    memset(s,false,sizeof(s));
    for(int i = 2; i <= MAX; i++)
    {
        if(!s[i])
            pr[k++] = i;
        for(int j = 0; j < k && i * pr[j] <= MAX; j++)
        {
            s[i * pr[j]] = true;
            if(i % pr[j] == 0)
                break;
        }
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值