题解:CF685A Robbers' watch

题解:CF685A Robbers' watch

感觉这题难点主要在理解题意。

题意

一天 \(n\) 个小时,一小时 \(m\) 分钟,手表用 \(7\) 进制表示时间(位数未填满补前导零),求问这个手表显示的每一位数字都不一样的时刻数量。

分析

因为是 \(7\) 进制,所以每一个数字位只可能出现 \(0\sim 6\)\(7\) 种数字,根据容斥原理,如果 \(n\)\(m\)\(7\) 进制位数之和大于 \(7\) 位了,那么就一定会有重复的数字,直接输出 \(0\)

因为限制到位数和只能不超过 \(7\) 位,那么数据规模就很小了,可以直接暴力枚举 \(n\)\(m\),枚举每个时刻,用 \(\text{check}\) 函数枚举一下 \(7\) 进制位有无重复即可。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int xx,yy;
int vis[10];
bool check(int x,int y)
{
    int a=x,b=y;
    for(int i=0;i<=6;i++)
        vis[i]=0;
    for(int i=1;i<=xx;i++)
    {
        vis[a%7]++;
        a/=7;
    }
    for(int i=1;i<=yy;i++)
    {
        vis[b%7]++;
        b/=7;
    }
    for(int i=0;i<=6;i++)
        if(vis[i]>=2)
            return 0;
    return 1;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m;
    if(n*m>6543210)
    {
        cout<<0<<endl;
        return 0;
    }
    int nn=n,mm=m;
    n--,m--;
    while(n)
    {
        xx++;
        n/=7;
    }
    while(m)
    {
        yy++;
        m/=7;
    }
    xx=max(xx,1ll);
    yy=max(yy,1ll);
    // cout<<xx<<" "<<yy<<endl;
    int ans=0;
    for(int i=0;i<nn;i++)
        for(int j=0;j<mm;j++)
            if(check(i,j))
                ans++;
    cout<<ans<<endl;
    return 0;
}
posted @ 2024-08-14 16:31  Ryan_Adam  阅读(9)  评论(0编辑  收藏  举报