我个人认为,这是一道数论题
思路:
用 $n$ 位的最小数 (也就是 $10^n$ ) % $210$ ,然后加 $210$ 减这个余数
别忘了加特判
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long ans=1;
int n;
cin>>n;
if(n==1||n==2){//特判
cout<<"-1"<<'\n';
return 0;
}else if(n==3){//特判
cout<<"210"<<'\n';
return 0;
}else{
while(n--)ans*=10;//先构造最小数
ans+=(210-(ans%210));//再取模
}
cout<<ans;
return 0;
}
可是你会发现:过不了,数据太大
然后试着找规律:
| n的值 | 结果 |
|---|---|
| 4 | 1050 |
| 5 | 10080 |
| 6 | 100170 |
| 7 | 1000020 |
| 8 | 10000200 |
| 9 | 100000110 |
| 10 | 1000000050 |
| 11 | 10000000080 |
可以发现,从 $4$ 开始,周期为 $6$ ,就会陷入一个循环:
“ $050$ “, “ $080$ “, “ $170$ “, “ $020$ “, “ $200$ “, “ $110$ “
发现规律后再添加 $1$ 和 $0$ 就可以了
AC 代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,t;
int main(){
cin>>n;
if(n==1||n==2)//特判
cout<<-1<<endl;
else if(n==3)//特判
cout<<210<<endl;
else{
t=(n-3)%6;//减去1和后缀占得位置
cout<<1;
for(int i=1;i<=n-4;i++)//根据位数输出0
cout<<0;
if(t==1)cout<<"050";
else if(t==2)cout<<"080";
else if(t==3)cout<<"170";
else if(t==4)cout<<"020";
else if(t==5)cout<<"200";
else if(t==0)cout<<"110";//t可能为0,如t=6
}
return 0;//完结撒花
}