P1112 波浪数 题解
难度:⭐⭐
知识点:构造法
题目链接
序言:以后想不出序言说什么就放一句名言吧
我们都是阴沟里的虫子,但总还是得有人仰望星空
——刘慈欣 《三体》
1. 入手程序
第一步,分析数据,暴力肯定不行
第二部,考虑是否可以模拟,发现虽然不能纯模拟,但可以使用...
构造法
2. 编程思路
所谓的构造法,指的是逆向的通过枚举或其他方法来构造出题目要求的数或情况
具体到这一题,就是枚举i进制下j,k轮流出现构成的波浪数的存在并存到对应重数数组下
最后将题目要求的重数输出出来
注意:
- 一位数也可以是波浪数
- 波浪数轮流出现的两个数不能一样
- 波浪数不一定要是“ababab...”形式,也可以是“abababa...”形式
- 一个波浪数不一定一定要在十进制下是波浪数
3. AC代码
#include<bits/stdc++.h>
using namespace std;
int m[10000005];//存重数
int a,b,c,d,e;
int main()
{
cin>>a>>b>>c>>d>>e;
for(int i=a;i<=b;i++)//在i进制下
{
for(int j=0;j<i;j++)//枚举第一个数
{
for(int k=1;k<i;k++)//枚举第二个数
{
if(j!=k)//两数不能一样
{
int v1=0;//构造用
int v2=0;//计数 用
while(v1<=d)
{
//循环用两个数构造
if(v2%2==0)
{
v1=v1*i+j;
}
else
{
v1=v1*i+k;
}
v2++;
if(v1>=c && v1<=d)
{
m[v1]++;//如果是波浪数,存到对应位置
}
}
}
}
}
}
for(int i=c;i<=d;i++)
{
if(m[i]==e)//如果有题目要求的重数,输出
{
cout<<i<<endl;
}
}
return 0;
}