
数论
宋紫恒
这个作者很懒,什么都没留下…
展开
-
BZOJ 2818 [SDOI2008] 仪仗队
以左下角为原点,注意到只有横纵坐标公因数为1的点才可以被看到,欧拉函数求gcd(x,y)=1的对数即可。 #include int 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 · 781 阅读 · 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 · 680 阅读 · 0 评论 -
Vijos P1090连续数之和
维护前缀和 假设有一段前缀和i~j sum[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 1234567 int f[1原创 2013-12-10 23:19:38 · 641 阅读 · 0 评论 -
1192: [HNOI2006]鬼谷子的钱袋
竟然没发现这道大水题。。。。 好像背包九讲里写过。什么二进制拆包。。。这个好像更弱。。。。 答案即为(int)(log2(m))+1 证明?显然。。。。。 代码: #include #include int main() { int m; scanf("%d",&m); printf("%d",(int)log2(m)+1); while(1);原创 2013-12-08 12:37:28 · 671 阅读 · 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 · 910 阅读 · 0 评论