【循环节】HDU 1005 and HDU 1097

来源:点击打开链接

1005,找循环节问题,根据鸽巢原理得到最多7*7种情况,分类讨论找一下循环节就行了,1097,找a^b的最后一位,也是循环节数论题。巩固一下。

hdu1005:

#include <iostream>
#include <cstring>
using namespace std;

long long tar[100];

int main()
{
	int a,b,c;
	while(cin>>a>>b>>c)
	{
		int start,end,flag=0;
		memset(tar,0,sizeof(tar));
		if(a==0 && b==0 && c==0)
			break;
		else
		{
			tar[1]=1;
			tar[2]=1;
			for(int i=3;i<=c && flag==0;i++)
			{
				tar[i]=(a*tar[i-1]+b*tar[i-2])%7;
				//找循环节方法 
				for(int j=2;j<i;j++)
				{
					if(tar[i]==tar[j] && tar[i-1]==tar[j-1])
					{
						start=j;
						end=i;
						flag=1;
						break;
					}
				}
			}
			if(flag)
			{
				cout<<tar[start+(c-end)%(end-start)]<<endl;
			}
			else
			{
				cout<<tar[c]<<endl;
			}
			
		}
		
	}
	return 0;
}

hdu 1097:

#include <iostream>
#include <cstring>
using namespace std;

int tar[21];

int main()
{
	int a,b;
	while(cin>>a>>b)
	{
		long long tmp=a;
		int flag=0;
		int start,end;
		a%=10;
		tar[0]=0;
		tar[1]=a;
		for(int i=2;i<=10 && flag==0;i++)
		{
				tmp*=a;
				tmp%=10;
				tar[i]=tmp;
				
				//cout<<"i:"<<i<<"  value is: "<<tar[i]<<endl;
				for(int j=2;j<i;j++)
				{
					if(tar[i]==tar[j] && tar[i-1]==tar[j-1])
					{
						start=j;
						end=i;
						flag=1;
						break;
					}
				}
		}
			if(flag)
			{
				cout<<tar[start+(b-end)%(end-start)]<<endl;

		
			}
	
	}
	return 0;
}


你可能感兴趣的:(【循环节】HDU 1005 and HDU 1097)