素數(shù)
有些人認為一個人一生中有三個周期,從他或她出生的那一天開始。
這三個周期是身體周期,情感周期的和智力的周期,他們有周期的長度為23,28,
和33天。每一個周期都有一個高峰。在一個周期的高峰期,
一個人在他/她在相應的領(lǐng)域(身體,情緒或精神)。
例如,如果它是心理曲線,思維過程會更清晰和集中會更容易。
由于三個周期有不同的周期,所以這三個周期的峰值一般發(fā)生在不同的時間。
我們想確定何時發(fā)生絕對高潮(所有三個周期的峰值發(fā)生在同一天)。
因為處于絕對高潮時人各方面均表現(xiàn)優(yōu)異,因此人們想知道絕對高潮在哪一天出現(xiàn)。
對身體周期,情緒周期和智力周期,給出本年內(nèi)他們各自的一個高潮日(不一定是第一個)后經(jīng)過的天數(shù)p,e,i。另外,給出本年內(nèi)已經(jīng)經(jīng)過的天數(shù)d(d>=0).求出在d所代表的日期多少天后,
三種周期的高潮日又一次在同一天出現(xiàn)。輸入:輸入數(shù)據(jù)有多組,每組測試數(shù)據(jù)占一行,有四個整數(shù),p,e,i和d. p,e,i 分別代表從0開始計時,身體周期,情感周期和智力周期首次出現(xiàn)高潮的日期,要求編程計算經(jīng)過d后多少天第一個絕對高潮出現(xiàn),輸入保證絕對高潮在21252內(nèi)的某一天出現(xiàn)。輸入以-1,-1,-1結(jié)束。輸出:例如:Case 1: the next triple peak occurs in 1234 days.23 28 33
d1 d2 d3d1+23k1=x
d2+28k2=x
d3+33k3=xx≡d1 %23≡d2 %28≡d3 %33//延續(xù)上體的解題方法
//逐級合并法
x=a1(%m1)=a2(%m2)=a3(%m3)
x=a1+m1y1 (1)
x=a2+m2y2
==>m1y1-m2y2=a2-a1這是一個線性方程可解出y1 linearEquation(m1,m2,a2-a1)帶回(1).得特解x0=a1+m1*y1-->x=x0+k*lcm(m1,m2)得一個新方程//lcm(m1,m2),m1,m2得公倍數(shù)x≡x0 (%lcm(m1,m2))形成新的a(x0),新的m(lcm(m1,m2))public static void main(String[] args)throws Exceeption{Scanner sc= new Scanner(System.in);int t=1;List<long[]> aList=new ArrayList<long[]>();List<long> dList=new ArrayList<long>();while(sc.hasNext()){long[] a={sc.nextLong(),sc.nextLong(),sc.Long()};long d=sc.nextLong();if(a[0]==-1&&a[1]==-1&&a[2]=-1&&d==-1)break;else{aList.add(a);aList.add(d);}}for(int i=0;i<aList.size();i++){long[] a=aList.get(i);long d=dList.get(i);long[] m={23,28,33};long res=Case05_ExtGcd.linearEquationGroup(a,m);while(res<=d){res+=21252;//保證在21252內(nèi),就是以21252為模}System.out.println("Case"+(t++)+": the next triple peak occurs in"+(res-d)+"days");}}
埃式篩法
public static void mian(){long now=System.currentTimeMillis();m1(100000);System.out.println(”耗時“+(System.currentTimeMillis()-now)+"ms" );
}private static void m1(int N){//N是第N個素數(shù)//已知在整數(shù)X內(nèi)大概有x/log(X)個素數(shù)//現(xiàn)在我們要逆推,要想求第N個素數(shù),我們的整數(shù)范圍是社么//length就是整數(shù)范圍int n=2;while(n/log(n)<N){//n個數(shù)中,大概有n/log(n)個素數(shù)n++;}//開辟一個數(shù)組,下標是自然數(shù),值是標記//基本思路是篩選法,把非素數(shù)標記出來//int[] arr=new int[n];int x=2;while(x<n){//標記過了。繼續(xù)下一個if(arr[x]!=0){continue;}int k=2;//對每個x,我們都從2倍開始,對x的k倍,全部標記-1while(x*k<n){arr[x*k]=-1;k++;}x++;}//System.out,println(arr);//篩完之后,這個很長的數(shù)組里面非素數(shù)下標對應的值都是-1int sum=0;for(int i=2;i<arr.length;i++){//是素數(shù),計數(shù)+1if(arr[i]==0){sum++;}if(sum==N){System.out,println(i);}}
}
?快速冪
反復平方
a^10 8 0 2 01 0 1 0
a^(2^3) a^(2^2) a^(2^1) a^(a^0);將次方轉(zhuǎn)成二進制,哪一位有1,就乘以那一位所在的a的平方值
如 a^10=a^(2^3)*a(2^1)public static long ex2(long n,long m){long primeFangShu = n;//n的1次方long result=1;while(m!=0){if((m&1)==1){result*=pingFangShu;//每移位一次,冪累成方一次pingFangShu=pingFangShu*pingFangShu;//無論等不等于1,次方都成倍乘//右移一位m>>=1;}return result;}}
?斐波那契與矩陣冪運算
(f1.f2)=(1,1)(f1,f2)*[0 1]=[f2.f3] //0+1=1=f1,1+1=2=f3=f1+f2[1 1](f1.f2)*[0 1]^2=[f3,f4][1 1]....遞推[f1,f2]*[0 1]^n-1=[fn,fn+1][1 1]public static long fib(long n){if(n==1||n==2)return1;long[][] matrix={{0,1},{1,1}};long[][] res=Util.matrixPower(matrix,n-1);//矩陣的乘方res=Util.matrixMultiply(new long[][]{(1,1)},res);//矩陣的乘方與f1f2相乘return res[0][0];}public long[][] matrixPower(long[][] matrix,long p){//初始化結(jié)果為單位矩陣,對角線為1
long[][] result=new long[matrix.length][matrix[0].length];
//單位矩陣。相當于整數(shù)的1for(int i=0;i<result.length;i++){result[i][i]=1;}//平方數(shù)
long[][] pingFang=matrix;//一次方for(;p!=0;p++){while(p!=0){if((p&1)!=0){//當前二進制最低位1,將當前平方數(shù)乘到結(jié)果中result=matrixMultiply(result,pingFang);}平方數(shù)繼續(xù)上翻pinFang=matrixMultiply(pingFang,pingFang);p>>1;}return result;
}}