[hdu 4215]Number Theory? 数论+打表
2014-04-09 23:00
459 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4215
题意为给出数字N,找出对应区间[L,R]的个数,使得1<=L<=R<=N,且对于该区间内的每一个值i(L<=i<=R)的两个指标:欧拉函数E(x)和因数个数F(x) sum(E(i))=sum(F(i)).
月赛第8题 但是想了好久如何去实现这个算法,因为F(n)和E(n)的求解复杂度基本都为nlogn,而题目时限1s 最大数据达到1e9.从内存和时间方面都不可能实现具体的求解。
看到这种题应该是打表。但是一直不是很清楚原理。
搜了下OEIS
找到四张图,应该可以比较清楚地了解
![](http://img.blog.csdn.net/20140409223332281?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWhtMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20140409223533671?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWhtMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从点的密度的所在的数量级上得知二者的发散程度相差较大。
下面两者的sum分布
![](http://img.blog.csdn.net/20140409224121843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWhtMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20140409224419671?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWhtMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
知二者大概在100-200左右就有了较大的分异,从而在200之后不会相等,不会出现新的区间,只需处理前面200的数据。
朴素打表前1000的答案,发现在30之后的答案就不会增长了。
只需处理前30的数据 剩余数据使用ans[30]即可。
题意为给出数字N,找出对应区间[L,R]的个数,使得1<=L<=R<=N,且对于该区间内的每一个值i(L<=i<=R)的两个指标:欧拉函数E(x)和因数个数F(x) sum(E(i))=sum(F(i)).
月赛第8题 但是想了好久如何去实现这个算法,因为F(n)和E(n)的求解复杂度基本都为nlogn,而题目时限1s 最大数据达到1e9.从内存和时间方面都不可能实现具体的求解。
看到这种题应该是打表。但是一直不是很清楚原理。
搜了下OEIS
找到四张图,应该可以比较清楚地了解
从点的密度的所在的数量级上得知二者的发散程度相差较大。
下面两者的sum分布
知二者大概在100-200左右就有了较大的分异,从而在200之后不会相等,不会出现新的区间,只需处理前面200的数据。
朴素打表前1000的答案,发现在30之后的答案就不会增长了。
只需处理前30的数据 剩余数据使用ans[30]即可。
//[hdu 4215]Number Theory? 数论+打表 by ahm001 #include<cstdio> #include<cstring> #define N 30 using namespace std; int i,o,p,j,k,l,n,m,t,r; int e[40]; int f[40]; int ans[40]; int gcd(int x,int y) { if (y==0) return x; return gcd(y,x%y); } int main() { memset(ans,0,sizeof(ans)); memset(e,0,sizeof(e)); memset(f,0,sizeof(f)); for (i=1;i<=N;i++) for (j=1;j<=i;j++) { if (gcd(i,j)==1) ++e[i]; if (gcd(i,j)==j) ++f[i]; } for (i=1;i<=N;i++) { e[i]+=e[i-1]; f[i]+=f[i-1]; } for (i=1;i<=N;i++) for (j=i;j<=N;j++) if(e[j]-e[i-1]==f[j]-f[i-1]) { ans[j]+=1; } for (i=1;i<=N;i++) ans[i]+=ans[i-1]; /*打表 更改N=1000 for (i=1;i<=N;i++) printf("%d ",ans[i]); */ scanf("%d",&t); p=0; for (;t;t--) { scanf("%d",&i); printf("Case %d: ",++p); if (i<=N) printf("%d\n",ans[i]); else printf("%d\n",ans ); } return 0; }
相关文章推荐
- HDU 4861 Couple doubi (数论 or 打表找规律)
- hdu 4002 数论 打表找规律 Find the maximum
- HDU 4919 Exclusive or (数论 or 打表找规律)
- hdu 4215 Number Theory?(***)
- hdu 2136 Largest prime factor(数论:打表)
- hdu 1215 数论 +打表
- hdu 1262 寻找素数对 数论 打表。
- hdu 2136 数论+筛选质数+打表
- 数论 - 筛法暴力打表 --- hdu : 12876 Quite Good Numbers
- HDU 4215 Number Theory?
- HDU 1215(数论,打表 - -|)
- 数论 - 筛法暴力打表 --- hdu : 12876 Quite Good Numbers
- hdu 1124 Factorial 数论,就是求一个数的阶乘的结果末尾有多少0.
- HDU1134 Game of Connections(大数乘法+打表)
- [数论]HDU 1452 Happy 2004 素因子分解+快速幂模+乘法逆元
- hdu 4335多校4数论
- HDU --- 5446 Unknown Treasure 数论综合【Lucas定理 + 中国剩余定理 + 快速乘 + 思维】
- HDU 5795 A Simple Nim (博弈 打表找规律)
- hdu 1999 不可摸数 筛选素数 两次打表
- HDU:1869 六度分离(floyd最短路径算法打表)