[20181016晚][模拟赛]

题目

enter image description here

思路

这个题目看了很久没有思路,旁边的大(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;
}

每篇一言

罪?那是人类们以自己的标准任意决定的。 ——寄生兽

原文地址:https://www.cnblogs.com/wxyww/p/9801758.html