TC SRM 552 DIV1 100PT(数论)
来源:互联网 发布:北京 补牙 知乎 编辑:程序博客网 时间:2024/05/01 08:07
转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
题目:对于一个数,如果所有的素数要么不是他的因子,要么就得小于某个上界并且这个数拥有奇数个这个素因子。
比如16就不满足,2^4,4为偶数。问1---UPTO范围里有多少个这样的数。
首先把范围内的素数表打出。
然后开始搜索素数,对于某个素数,只能取奇数个,或者不取。
看代码注释
bool flag[1000005]={0};vector<int>v;class HolyNumbers{ public: //预处理素数表 void Init(int n){ for(int i=2;i<=sqrt(n+1.0);i++){ if(flag[i]) continue; for(int j=2;j*i<=n;j++) flag[i*j]=true; } for(int i=2;i<=n;i++) if(!flag[i]) v.push_back(i); } //搜索到第idx个素数,这时候的范围是 1--up LL slove(int idx,LL up){ //如果素数没了,而且当前及以后的素数都超过范围,则返回1 //这个1表示之前搜的素数组成的数刚好就是要求的数 //初始的话就是返回1就代表1是满足条件的 if(idx>=v.size()||v[idx]>up) return 1; if((LL)v[idx]*v[idx]>=up){ //这里说明这个素因子以及后面的素因子都不可能取3个 //那么求出有多少个素因子可以取,都是取1个 int k=upper_bound(v.begin()+idx,v.end(),up)-v.begin(); return k-idx+1; } LL p=v[idx]; //不取这个素因子 LL ans=slove(idx+1,up); //取奇数个 for(LL num=p;num<=up&&num>0;num*=p*p) ans+=slove(idx+1,up/num); return ans; } LL count(LL upTo, int maximalPrime){ v.clear(); Init(maximalPrime); return slove(0,upTo); }};
- TC SRM 552 DIV1 100PT(数论)
- TC SRM 559 DIV1
- TC srm 632 div1
- [TC SRM 571] DIV1 1000
- tc-SRM-626-DIV1-250
- 【TC SRM 596 DIV1】BitwiseAnd
- SRM 613 div1 500pt
- SRM 598 DIV1 500 pt
- TC SRM 519 600pt
- tc SRM 554 1000pt
- TC SRM 638 div1 300 ShadowSculpture
- SRM 552 Div1
- TC SRM 552 DIV2
- 【jzoj3918】【TC Srm 636 Div2 1000pt】【蛋糕】【二分答案】
- 数论+快速幂 SRM 661 Div1 450: ColorfulLineGraphs
- TC srm519 div1
- TC SRM520 div1
- TC SRM630 div1
- 模拟QQ聊天窗口
- Web.config详解
- CentOS6.2+Apache+Mysql安装Redmine
- java中的工厂模式
- IOS学习笔记28—SQLite3第三方库之FMDB
- TC SRM 552 DIV1 100PT(数论)
- RenderToolbox的学习笔记(一)
- 快速排序-几种不同的划分方法
- 我要学ASP.NET MVC 3.0(十八): MVC 3.0 实例系列之表格中合并排序、分页和筛选
- ccsu 1179 青蛙过河 递推
- Linux设备模型
- Java国际化小小示例
- ASP.NET MVC 3.0学习系列(19)-开源控件实现表格排序和分页
- mysql中如何使用INSERT一次性插入多条记录