All pastes #207555 Raw Edit

Untitled

public text v1 · immutable
#207555 ·published 2006-10-18 02:14 UTC
rendered paste body
#include<stdio.h>
#include <math.h>

long long m;
int st[2][2]={1,1,1,0};

long long final[2][2];

long long pt[32]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,
					16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648};

long long ptm[32]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
int indeks=0;


struct TAB
{
	long long a[2][2];
}A[32];


wypelnij_tab()
{
	int i=1;

	A[0].a[0][0]=1;
	A[0].a[0][1]=1;
	A[0].a[1][0]=1;
	A[0].a[1][1]=0;
	
	while(i<=31)
	{
		A[i].a[0][0] = A[i-1].a[0][0]*A[i-1].a[0][0] + A[i-1].a[0][1]*A[i-1].a[1][0];
		if(A[i].a[0][0]>=m)A[i].a[0][0]=A[i].a[0][0]%m;
		A[i].a[0][1] = A[i-1].a[0][0]*A[i-1].a[0][1] + A[i-1].a[0][1]*A[i-1].a[1][1];
		if(A[i].a[0][1]>=m) A[i].a[0][1]=A[i].a[0][1]%m;
		A[i].a[1][0] = A[i-1].a[1][0]*A[i-1].a[0][0] + A[i-1].a[1][1]*A[i-1].a[1][0];
		if(A[i].a[1][0]>=m) A[i].a[1][0]=A[i].a[1][0]%m;
		A[i].a[1][1] = A[i-1].a[1][0]*A[i-1].a[0][1] + A[i-1].a[1][1]*A[i-1].a[1][1];
		if(A[i].a[1][1]>=m)A[i].a[1][1]=A[i].a[1][1]%m;
		
		i++;
	}

}

poteguj(long long n)
{
	int i;
	
do
{

	for(i=0;;++i)
	{
		if(pt[i]>=n)
			break;
	}
	if(pt[i]!=n)
		i--; //maksymalna potega czyli dla 20 bedzie to 16 

	ptm[indeks++]=(int)(log10(pt[i])/log10(2));

	n=n-pt[i];

}while(n!=0);


}

mnoz_maciez_st()
{
	int i;
	long long a,c;

	final[0][0]=A[ptm[0]].a[0][0];
	if(final[0][0]>=m) final[0][0]=final[0][0]%m;
	final[0][1]=A[ptm[0]].a[0][1];
	if(final[0][1]>=m) final[0][1]=final[0][1]%m;
	final[1][0]=A[ptm[0]].a[1][0];
	if(final[1][0]>=m) final[1][0]=final[1][0]%m;
	final[1][1]=A[ptm[0]].a[1][1];
	if(final[1][1]>=m) final[1][1]=final[1][1]%m;

	a=final[0][0];
	c=final[1][0];

	for(i=1;ptm[i]!=-1;++i)
	{
		final[0][0]=a*A[ptm[i]].a[0][0] + final[0][1]*A[ptm[i]].a[1][0];
			if(final[0][0]>=m) final[0][0]=final[0][0]%m;

		final[0][1]=a*A[ptm[i]].a[0][1] + final[0][1]*A[ptm[i]].a[1][1];
			if(final[0][1]>=m) final[0][1]=final[0][1]%m;

		final[1][0]=c*A[ptm[i]].a[0][0] + final[1][1]*A[ptm[i]].a[1][0];
			if(final[1][0]>=m) final[1][0]=final[1][0]%m;

		final[1][1]=c*A[ptm[i]].a[0][1] + final[1][1]*A[ptm[i]].a[1][1];
			if(final[1][1]>=m) final[1][1]=final[1][1]%m;

		a=final[0][0];
		c=final[1][0];


	}

}






main()
{
	long long a,b,n;
	int C;
	int i=1;
	long long val;

	int l,j,k;

	/*

	for(l=0;l<=31;l++)
	{
		for(j=0;j<2;j++)
		{
			for(k=0;k<2;k++)
			{
				printf("%u ",A[l].a[j][k]);
			}
			printf("\n");
		}
		printf("....\n");
	}*/



	C=1;//scanf("%d",&C);

	while(i<=C)
	{
		a=1;//scanf("%u",&a);
		b=1;//scanf("%u",&b);
		n=50;//scanf("%u",&n);
		m=10;//scanf("%u",&m);

		wypelnij_tab();

		poteguj(n);

		mnoz_maciez_st();


		val=(a+b)*final[0][0]+b*final[1][0];
		val=val%m;


		printf("%lld\n",val);

		i++;
	}



}