同余与模算术

大整数取模:

输入正整数n和m,输出n mod m的值。n<=10^100,m<=10^9。

分析:把大整数写成自左向右的形式 (((1*10+2)*10)+3)*10+4

scanf("%s%d",n,&m);
int len=strlen(n);
int ans=0;
for(int i=0;i<len;i++)
	ans=(int)(((long long)ans*10+n[i]-'0')%m);
printf("%d\n",ans);

幂取模:

输入正整数 a,n和m,输出a^n mod m的值 。a,n,m<=10^9。

O(n):

int pow_mod(int a,int n,int m)
{
	int ans=1;
	for(int i=0;i<n;i++)
		ans=(int)((long long)ans*n%m);
}

O(log n):

int pow_mod(int a,int n,int m)
{
	if(n==0)
		return 1;
	int x=pow_mod(a,n/2,m);
	long long ans=(long long)x*x%m;
	if(n%2==1)
		ans=ans*a%m;
	return (int)ans;
}

 

posted @ 2019-04-26 16:37  是妖妖灵鸭  阅读(109)  评论(0编辑  收藏  举报