速递: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");
}
}