随笔分类 - 数论
摘要:这个题就是欧拉定理的简单运用:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespac
阅读全文
摘要:简单的容斥定理的运用:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace st
阅读全文
摘要:容斥定理:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#include<string>#define LL long longusing namespace std;LL n
阅读全文
摘要:这个题要用容斥定理,求出x与y互质的对数,然后x与y同时乘以k,如果x与y都在范围之内,则这一对符合条件;这里的处理方法就是对b与d缩小k倍,寻找里面的互质的数的对数,我们在扩大k倍,就可以解决,上面存在的问题;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include&l
阅读全文
摘要:扩展欧几里得的运用:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>#define LL long longusing namespace std;LL Ex_Gcd( LL a , LL
阅读全文
摘要:由于bi,bj不保证互素,不能用直接套中国剩余定理,做法是利用欧几里德扩展定理,将两个等式合并,然后再与其他的等式一一合并对于x=b1 mod a1,x= b2 mod a2,设x=b1+m1*a1 , x = b2 + m2*a2;所以 b1 +m1*a1 = b2 + m2*a2;所以a1*m1=b1-b2 mod a2,利用欧几里德扩展定理求出最小的非负m1,那么x=b1+m*a1就已知,且x最小,如果无解,整个同余式组无解;同时,x+k*a1是所有满足x≡b1 mod a1的解,而x+k'*a2又是所有满足x≡b2 mod a2的解那么,将x+k*b1与x+k'*b2合
阅读全文
摘要:1.5 中国剩余定理出自Bupt_wiki跳转到: 导航, 搜索这篇文章写的很清晰,所有就COPY过来了,与大家分享;●知识精讲 这个问题源自于我国数学古书《孙子算经》中的一道问题:“今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二。问物几何?”意思是一个整数除以三余二,除以五余三,除以七余二,求这个整数(满足条件且最小)。做法是: n%3=2,n%5=3,n%7=2且3,5,7互质 找到使(5×7)的倍数模3得1的数,答案是70 找到使(3×7)的倍数模5得1的数,答案是21 找到使(3×5)的倍数模7得1的数,答案是15 那么(70×
阅读全文
摘要:这道题,是求n*m的矩形内,有多少对互质的数(x,y)即Gcd( x ,y ) ==1;这个题首先用到欧拉的质因子分解,再利用容斥定理;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>usi
阅读全文
摘要:先画一条(0, 0)到(n, n)的线,把图分成两部分,两部分是对称的,只需算一部分就好。取右下半,这一半里的点(x, y)满足x >= y可以通过欧拉函数计算第k列有多少点能够连到(0, 0)若x与k的最大公约数d > 1,则(0, 0)与(x, k)点的连线必定会通过(x/d, k/d),就被挡住了所以能连的线的数目就是比k小的、和k互质的数的个数,然后就是欧拉函数。方法一:View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>
阅读全文
摘要:这个题就是一个扩展欧几里得的运用;B≡(A+K*C)%L 即 B = A + K*C + H*L ;B - A = KC + HL ;即线性方程为 a*x + b*y = c;View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#incl
阅读全文
摘要:一只青蛙1一开始在x位置,另一只青蛙2在y位置。青蛙1每次跳m米,青蛙2每次跳n米,并且都是向右跳的。地球经线长度是L,然后地球是圆的,也就是说,对L取模;问多少次后它们能跳到一起。如果它们永远不能相遇,就输出Impossible求一个k,使x + k*m ≡ y + k*n (mod L) ,就变成(n-m) * k ≡ x-y (mod L)咯。然后这个方程其实就等价于(n-m)*k + L*H = x-y咯。这就是ax + by = c求整数x的模型。要求ax + by = c的整数x解;就可以利用扩展欧几里得出答案;View Code #include<iostream>#
阅读全文
摘要:这个题要用到欧拉函数;a1^p1*a2^p2*a3^p3……an^pn,那么他的因子就有(p1 +1)*(p2+1)*……*(pn+1);View Code #include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include<vector>us
阅读全文
摘要:该题刚开始用最原始的方法,先筛出质数,再利用X=( p1-1)*( p2-1)*....*( pn-1)*( p1^(q1-1))*( p2^( q2-1))*...*( pn^( qn-1)),我就测试了一下3--3000000发现要好长的时间我就知道这种方法一定会超时;后来看了解题报告,才知道有如下的线性筛选法( 我个人刚开始不太喜欢线性法,因为我与其比较过其他的筛选法,发现并没有那么快,并且还要开那么大的数组,后来发现线性筛选法可以与好多的题目的结合处理特别好,现在也开始钟情它了);在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因素)(1) 若(N%a==0 &
阅读全文
摘要:该题要注意的就是每张单子A种类的总和不能大与600,同样B,C类也一样,刚开始我就错了这里,还有注意如果不是A,B,C类的不可以报销;该题就是要把浮点型变成整数这样才能用01背包,这里就只要乘以100就可以了。#include<stdio.h>#include<stdlib.h>#include<string.h>int f[5000024]={0};int DP( int num[],int count, int sum ){ memset( f,0,sizeof( f ) ); for(int i=0;i<count; i++) { for( in
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>int Gcd( int a,int b ){ b==0?a:Gcd( b,a%b ); }int main(){ int n,m; while( scanf( "%d%d",&n,&m ),-1!=n&&-1!=m ) { if( 1==Gcd( n,m ) ) printf( "YES\n" ); else printf( "POOR Haha\n" ); } return 0; }该题与HD...
阅读全文
摘要:该题是是给出前3个数,要么是等差要么是等比,要你求第k个数,这个题关键是用到快速取幂;#include<stdio.h>#include<stdlib.h>long long getq( long long t,int k ){ if( k==1 ) return t; long long q = getq( t,k/2 ); if( k%2 ) { return ( q*q*t )%200907; } else return ( q*q )%200907; }int main(){ ...
阅读全文
摘要:该题就是HUD 1792与HDOJ 1222 Wolf and Rabbit的结合,先判断公约数是否大于1,如果大于就一定输出Inf,否则,就输出m*n-n-m;#include<stdio.h>long long Gcd( long long a, long long b ){ return b==0?a:Gcd( b,a%b ); }int main(){ long long n,m; while( scanf( "%I64d%I64d",&n,&m ),n||m ) { if( Gcd( n,m )==1 ) { ...
阅读全文
摘要:要判断给定的n(2<=n<=10^18)是不是squarefree number;因为给定的数最大达到10^18,所以直接暴力肯定是杯具的TLE;我们知道 N必为 3种之一: 素数,素数的平方,两个不同素数之积。10^18=10^6^3;那么我们求质数就只要求到10^6就可以,因为大于10^6就只能是平方次方,不可能是立方,因此可以用开方来判断;假如我们求质数小于10^6,那么可能这个数是一个数的立方,或者是一个质数的平方乘以一个数,但不能开方,但又不能被前面的质数相除,因此会造成不是squarefree number的假象。实现思路:1. 计算1000000以下 素数,存于 nu
阅读全文
摘要:刚开始试着用n*log(n)的方法去解,但细想一下这个方法是不行的,因为精度丢失好大,后来试着推里面的规律,这个规律就是n^n变成n^(n-1)再乘以n的所有位数之和,n^( n-2 )*((n的前所有位数之和)*n的前所有位数之和),以此类推。#include<stdio.h>#include<stdlib.h>#include<math.h>inline int SUM( int n ){ int sum=0,z=1; while( n/z ) { sum+=n%(z*10)/z; z*=10; } return...
阅读全文
摘要:看了这个题好久还是不知道怎么做,后来经过lvsi的指导,才把它给A了。m=n^n;两边同取对数,得到,log10(m)=n*log10(n);再得到,m=10^(n*log10(n));然后,对于10的整数次幂,第一位是1,所以,第一位数取决于n*log10(n)的小数部分;我们知道一个数x可以用10^(n +m)( n可以是小数,m是整数 )表示,那么10^n就是表示x/10^m之后的数及前面的数值。#include<stdio.h>#include<stdlib.h>#include<math.h>int main(){ int T; double N;
阅读全文

浙公网安备 33010602011771号