最新网站信息,网络维护费计入什么科目,设计网站建,wordpress 外网访问 登录路由器链接
传送门
代码
#includebits/stdc.h
using namespace std;const int N1e610;
//78498 我计算了一下#xff0c;6个0的范围内有这么多个素数#xff0c;所以开这么大的数组存素数
//计算的代码是一个循环
int prime[80000];
int a[N],s[N];//s数组是前缀和数组b…链接
传送门
代码
#includebits/stdc.h
using namespace std;const int N1e610;
//78498 我计算了一下6个0的范围内有这么多个素数所以开这么大的数组存素数
//计算的代码是一个循环
int prime[80000];
int a[N],s[N];//s数组是前缀和数组bool isprime(int a)//判断素数的模板函数
{if(a2) return false;for(int i2;i*ia;i){if(a%i0) return false;}return true;
}int main()
{int cnt0;for(int i0;iN;i){if(isprime(i)){prime[cnt]i;//这表示从下标为1的位置开始计算}//找出所有的素数}// for(int i1;i1000;i)
// {
// printf(%d\n,prime[i]);
// }for(int i1;icnt;i){int tempprime[i]prime[i1];temp/2;if((prime[i]%2!0)(prime[i1]%2!0)(!isprime(temp))){a[temp]1;}}//printf(%d\n,a[15]);for(int i3;iN;i){if(a[i]1){s[i]s[i-1]1;//前缀和的使用前缀和就是说//前面的数据已经被处理过了比如说处理到i这个位置i-1这个位置//已经被处理过了可以直接使用就不需要从头开始多次计算//本来要计算1到i-1,1到i现在不需要计算1到i所以降低了时间复杂度}else{s[i]s[i-1];}}int t;scanf(%d,t);while(t--){int c,d;scanf(%d%d,c,d);printf(%d\n,s[d]-s[c-1]);//这里可以理解成//图片这种是前缀和的公式可以直接记住}return 0;
}
计算素数个数的代码
#includebits/stdc.h
using namespace std;bool isprime(int a)
{if(a2) return false;for(int i2;i*ia;i){if(a%i0) return false;}return true;
}int main()
{int cnt0;for(int i0;i1e6;i){if(isprime(i)){cnt;}}printf(%d\n,cnt);return 0;
}
用于理解前缀和的图片 总结
1.该题考查前缀和通过前缀和来降低时间复杂度原理写在代码注释中了连续的素数应该要怎么处理把素数提取出来存在数组中怎么提取出来用一个计数器作为数组下标cnt表示的是使用自增之后的数字也就是说cnt初始化为0的话是从1开始保存素数的
2.a数组用来保存所谓的内部素数的状态把内部素数作为a数组的下标把数组的数值标记为1建立一个下标和数值之间的映射关系
3.最后是遍历整个区间寻找有多少个被标记的a数组使用前缀和从而得出答案
4.前缀和的公式就是最后输出的那个s[d]-s[c-1]
5.前面都属于打表循环遍历预处理所有元素把有需要的元素存在数组里面