CF248B Chilly Willy


题目传送门

我个人认为,这是一道数论题

思路:

用 $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;//完结撒花
}

文章作者: alex_liu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 alex_liu !
  目录