Codeforces-1753B Factorial Divisibility题解
Codeforces-1753B Factorial Divisibility
参考:https://blog.csdn.net/qq_38236082/article/details/127500190
题意:问能否被整除。
思路:暴力肯定不行的,无法正常存储。考虑其他做法,由于,要想能被整除,和中一定存在这个因子。
举一个例子,假设给定的数是,,,,。
对于,我们先拆出一部分因子,这部分因子是必定存在于最终的和中的。左边除去后我们剩下什么?剩下,很容易发现,这部分不能够被整除,也就是说,剩余的这一部分不存在这个因子(而这个因子是存在于中的!)。因此这个例子不能被整除。
如果要求其能被整除,应该是什么样的数据呢?很容易想到,对于(上面那个例子)左边除去后,只有剩下的部分能够被整除,这个判断才能够继续下去。因此我们更改数据为,,,,,。此时除去后,剩余,可以被整除。我们继续拆去这个因子,除去剩余,判断出还是不行。但是我们已经基本了解了应该怎么判断——先对取,记录这一串和中,的个数,随后从扫描,对于数,如果不是的倍数(即不能提供出因子),就直接判断不能整除;如果是倍数,我们将加到上。
由于注意到非常大,我们还可以浅浅开个小快读,但不是必要。
#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; }
分类:
codeforces
标签:
数论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】