HIT 1008 数论

How many N

Source : xy
Time limit : 15 sec Memory limit : 32 M

Submitted : 5977, Accepted : 1136

Find a minimal interger K which is merely comprised of N and can be divided by M.

For example,11 is the minimal number that and be divided by 11, and it is comprised of two '1's, and 111111 can be divided by 13 which is comprised of six '1's.

Input

On each line of input , there will be two positive integer, N and M. N is a digit number, M is no more than 10000.

Output

On each single line, output the number of N, if no such K, output zero.

Sample Input
1 5
1 11
1 13

Sample Output
0
2
6

 
 
据说暴力就可以过了,不过我还是用了数论中的东西
 
 
不过个人感觉这个题要么数据太强大,要么就是数据有问题,我代码中有一个无关紧要的东西,居然改掉了就错了。。我也不知道为啥
至于做法,可以参考POJ上的一个题目,当然那个题我也写了相应的解题报告
http://poj.org/problem?id=3696
 
 
我的代码:
#include<stdio.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>

using namespace std;

typedef long long ll;

ll gcd(ll a,ll b)
{
	if(b==0)
		return a;
	else
		return gcd(b,a%b);
}

ll eular(ll n)
{
	ll res=1,i;
	for(i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			res=res*(i-1);
			n=n/i;
			while(n%i==0)
			{
				res=res*i;
				n=n/i;
			}
		}
		if(n==1)
			break;
	}
	if(n>1)
		res=res*(n-1);
	return res;
}

ll exmod(ll p,ll n,ll m)
{
	ll sq=1;
	while(n>0)
	{
		if(n%2==1)
			sq=(sq%m)*(p%m)%m;
		p=(p%m)*(p%m)%m;
		n=n/2;
	}
	return sq%m;
}

int main()
{
	ll n,m,g,M,phi,i;
	ll a[1000],num;
	while(scanf("%lld%lld",&n,&m)!=EOF)
	{
		g=gcd(m,n);//这里理论上取9m和n的最大公约数也是可行的。恩,但是改掉就WA了,我也不知道为啥
		M=9*m/g,num=0;
		if(gcd(M,10)!=1)
		{
			printf("0\n");
			continue;
		}
		phi=eular(M);
		for(i=1;i*i<=phi;i++)//其实这里还可以更快,直接质因数分解之后来搞,恩
		{
			if(phi%i==0)
			{
				a[num++]=i;
				a[num++]=phi/i;
			}
			if(i*i==phi)
				a[num++]=i;
		}
		sort(a,a+num);
		for(i=0;i<num;i++)
			if(exmod(10,a[i],M)==1)
			{
				printf("%lld\n",a[i]);
				break;
			}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值