codeforces 327C Magic Five 分数形式整数取余

#include <stdio.h>
#include <string.h>
#include <math.h>
#define mod 1000000007 
__int64 pows(__int64 a,__int64 b)
{
	__int64 s=1;
	while(b){
		if(b&1)
		s=(s*a)%mod;
		a=(a*a)%mod;
		b=b>>1;
	}
	return s;
}
char a[100001];
int main()
{
	__int64 k,i,j,n,m,p,q;
	//printf("%I64d\n",pows(2,mod));
	while(scanf("%s%I64d",a,&k)!=EOF){
		m=strlen(a);
		n=m*k;
		__int64 s=0;
		for(i=0;i<m;i++)
		{
			if(a[i]=='5'||a[i]=='0'){
				s=(s+pows(2,i))%mod;
			}
		}
		//printf("%I64d\n",s);
		p=pows(2,n)%mod-1;
		//printf("%I64d\n",k);
		q=(p*pows(pows(2,m)-1,mod-2))%mod;
		s=(s*q)%mod;
		printf("%I64d\n",s);
	}
	return 0;	
}
//除法取余方法的一种,(a/b)%mod,等价于(a*b^(mod-2))%mod,mod为素数

你可能感兴趣的:(除法取余)