题目描述
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;
}
}
}