数论
宋紫恒
这个作者很懒,什么都没留下…
展开
-
BZOJ 2818 [SDOI2008] 仪仗队
以左下角为原点,注意到只有横纵坐标公因数为1的点才可以被看到,欧拉函数求gcd(x,y)=1的对数即可。#includeint phi[50000];void phi_table(int n){ phi[1]=1; for(int i=2;i<n;i++) phi[i]=i; for(int i=2;i<n;i++) if(phi[i]==i)原创 2013-11-23 07:24:56 · 764 阅读 · 0 评论 -
1041: [HAOI2008]圆上的整点
数论题无力Orz...看了下题解,所以总结下吧,主要是运用gcd和分解质因数来进行优化。。觉得写得很好,所以把题解搬过来了=。=首先让我们一起来推下公式:x^2+y^2=r^2 y^2=r^2-x^2 y^2=(r-x)(r+x)到这里为止应该都很容易想到,接下来是关键设d=gcd(r-x,r+转载 2013-12-07 13:50:41 · 657 阅读 · 0 评论 -
Vijos P1090连续数之和
维护前缀和假设有一段前缀和i~jsum[j]-sum[i-1] mod k=0显然sum[i-1] mod k=sum[j] mod k这样在读入的时候我们可以统计mod k余数为r的个数。在余数相同的数中,任意两个匹配都可以。ans+=n*(n-1)/2 n为余数为r的数的个数。注意特殊情况!#include#define MOD 1234567int f[1原创 2013-12-10 23:19:38 · 614 阅读 · 0 评论 -
1192: [HNOI2006]鬼谷子的钱袋
竟然没发现这道大水题。。。。好像背包九讲里写过。什么二进制拆包。。。这个好像更弱。。。。答案即为(int)(log2(m))+1证明?显然。。。。。代码:#include#includeint main(){ int m; scanf("%d",&m); printf("%d",(int)log2(m)+1); while(1);原创 2013-12-08 12:37:28 · 637 阅读 · 0 评论 -
BZOJ 2818 Gcd
因为要求出gcd(x,y)=k (k为素数)的对数所以用筛法求出1~n之内的素数,枚举每一个素数。∵gcd(x,y)=k ∴gcd(x/k,y/k)=1因为y含有因数k,所以y=k,2k,3k,4k...pk (p=n/k)对于一个已知的y,求出phi(y/k)即为x的个数所以ans+=phi(1)+2*(phi(2)+phi(3)+..+phi(p))原创 2013-11-22 19:50:23 · 881 阅读 · 0 评论