题目
![enter image description here](https://upload-images.jianshu.io/upload_images/13850502-657be3127c5313de.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
思路
这个题目看了很久没有思路,旁边的大(S)佬(B)不到十分钟就秒了。知道正解之后感觉自己太菜了。
首先题目意思就是,要找到两个数,使得这两个数中所有的数码都是对应的。也就是x的数码中如果有1,2,3那么y中也必须有1,2,3对个数不做限制。那么就用一个数来表示一些数码组合。比如说123,那么就找一个二进制上1,2,3位都是1的数7来表示由1,2,3组成的数。然后从1扫到n,因为先扫到小的,所以后面可以直接查询,然后修改。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll read() {
ll x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int now = 0;
int solve(int x) {
int now = 0;
while(x) {
now |= 1<<(x%10);
x /= 10;
}
return now;
}
ll a[10000000];
int main() {
int n = read();
ll ans = 0;
for(int i = 1;i <= n;++i)
ans += a[solve(i)]++;
cout<<ans;
return 0;
}
每篇一言
罪?那是人类们以自己的标准任意决定的。 ——寄生兽