Codeforces-1753B Factorial Divisibility题解

Codeforces-1753B Factorial Divisibility

  参考:https://blog.csdn.net/qq_38236082/article/details/127500190

  题意:问a1!+a2!+a3!+...+an!能否被x!整除。

  思路:暴力肯定不行的,x!无法正常存储。考虑其他做法,由于x!=x(x1)(x2)...21,要想能被x!整除,和中一定存在这x个因子。

  举一个例子,假设给定的数是2!,2!,4!,5!x=5

  对于2!+2!+4!+5!,我们先拆出一部分因子2!,这部分因子是必定存在于最终的和中的。左边除去2!后我们剩下什么?剩下1+1+34+345,很容易发现,这部分不能够被3整除,也就是说,剩余的这一部分不存在3这个因子(而3这个因子是存在于x!中的!)。因此这个例子不能被x整除。

  如果要求其能被x!整除,应该是什么样的数据呢?很容易想到,对于(上面那个例子)左边除去2!后,只有剩下的部分能够被3整除,这个判断才能够继续下去。因此我们更改数据为2!,2!,2,4!,5!x=5。此时除去2!后,剩余1+1+1+34+345,可以被3整除。我们继续拆去3这个因子,除去3剩余1+4+45,判断出还是不行。是我们已经基本了解了应该怎么判断——先对a[n]cnt[i],记录这一串和中,i!的个数,随后从扫描1 (x1),对于数icnt[i]如果不是i+1的倍数(即不能提供出i+1因子),就直接判断不能整除;如果是倍数,我们将cnt[i]/(i+1)加到cnt[i+1]上。

  由于注意到n非常大,我们还可以浅浅开个小快读,但不是必要。

 

复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=5e5;
const int maxx=5e5;

int n,x;
int a[maxn+5];
int cnt[maxx+5];

inline int read(){
    register int ch=getchar(),x=0,f=1;
    while (ch<'0'||ch>'9'){
        if (ch=='-')    f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}

int main(){
//    freopen("1.txt","r",stdin);
    n=read(),x=read();
    for (int i=1;i<=n;i++)
        cnt[a[i]=read()]++;
    sort(a+1,a+n+1);
    for (int i=1;i<x;i++)
        if (cnt[i]%(i+1)){
            printf("No");
            return 0;
        }
        else
            cnt[i+1]+=(cnt[i]/(i+1));
    printf("Yes");
    return 0;
} 
复制代码

 

posted @   wegret  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示