1385. Interesting Number 规律题

速递:https://acm.timus.ru/problem.aspx?space=1&num=1385
题意:
数T长为2N,前N位构成A,后N位构成B,求使得T%A=0且T%b=0的数有多少个。T无前导0。

题解:
设A、B是两个长为N的数,A无前导零,则数为A * 10N+B。
满足题目要求的话:
1.(A * 10N + B) %B = 0;
2.B%A=0。
由 2 知,B=k*A,1<=k<=9

则:(A * 10N + B) %B
= (A * 10N) %B + B%B
= (A * 10N) %B
= (A * 10N)%(k * A)
= (10N)%k=0
则:
N=1:k=1,2,5
N=2:k=1,2,4,5
N>=3:k=1,2,4,5,8

k=1:10N -1 - 10N-1 + 1 = 9 * 10N-1
k=2:(10N-1)/2 - 10N-1 + 1 = (10N- 2)/2 - 10N-1+1=4 *10N-1
k=4:(10N-1)/4 - 10N-1 + 1 = (10N- 4)/4 - 10N-1+1=1.5 *10N-1
k=5:(10N-1)/5 - 10N-1 + 1 = (10N- 5)/5 - 10N-1+1=1 *10N-1
k=8:(10N-1)/8 - 10N-1 + 1 = (10N- 8)/8 - 10N-1+1=0.25 *10N-1

N=1:14 * 10N-1=14
N=2:15.5 * 10N-1=155
N>=3:15.75 * 10N-1=1575*(10N-3)

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
using namespace std;
#define ll long long
const int maxn=1e3+6;
ll qpow(ll a,ll n){
	ll ans=1;
	while(n){
		if(n&1)ans=ans*a;
		a=a*a;
		n=n/2;
	}
	return ans;
}
int main(){
	int N;
	cin>>N;
	if(N==1)printf("14");
	else if(N==2)printf("155");
	else if(N==3)printf("1575");
	else{
		printf("1575");
		N=N-3;
		while(N--)printf("0");
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值