【USACO】Cow Brainiacs
题意描述
求 \(n!\) 在 \(b\) 进制表示下的第一位非 \(0\) 位的数字。
算法分析
闲话
忙人自动略过
之前做过一道 \(10\) 进制表示下的题目,感觉差不多。
一开始没什么思路,就随手打了个暴力进去,结果竟然 AC 了。(只能说数据水)
n=read(),b=read();
for(int i=2;i<=n;i++){
f*=i;
while(f%b==0)
f/=b;
f%=b;
}
开开心心交给 GY,结果 \(2\) 分钟之后被 Hack 了。
对于 15 10
,显然答案为 \(8\),但是程序给出的结果为 \(3\)。
被 Hack 的结果是我只记录了末尾 \(1\) 位的数值,由于 \(14!\) 的末尾为 \(2\),所以 \((2\times 15)\ mod\ 10=3\)。
所以对于十进制来说,记录末尾 \(7\) 位就不会有问题了,但是对于 \(b\) 进制来说却远远不够,只能另寻他路。
下面是正解。
正解
终于要 BB 正解了
让我们假设 \(n!\) 的 \(b\) 进制表示的末尾并没有 \(0\)(即 \(n!\ mod\ b\neq 0\)),那么答案只要保留一位不断 \(mod\ b\) 即可。
虽然显然几乎不可能有这种情况发生,但是我们可以构造这种情况。
倘若我们把 \(n!\) 表示为 \(b^k\times a\),那么我们只需要求 \(a\) 的 \(b\) 进制表示的第一位即可(因为 \(a\ mod \ b\neq 0\))。
实现方法是将 \(b\) 质因数分解,然后将 \(n!\) 都质因数分解,将 \(b\) 的质因子减去殆尽即可。
具体看代码吧。
代码实现
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 20
using namespace std;
int n,b,tot[N],num[N];
int pri[N],cnt=0;
int prime[N]={0,2,3,5,7,11,13,17,19,23,29};
//B 的质因子只有这 10 中可能。
int read(){
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0' && c<='9') x=x*10+c-48,c=getchar();
return x*f;
}
int main(){
n=read(),b=read();
memset(tot,0,sizeof(tot));
memset(num,0,sizeof(num));
int bb=b;
for(int i=1;i<=10;i++){
if(bb%prime[i]!=0) continue;
pri[++cnt]=prime[i];//记录 B 的质因子的种类。
while(bb%prime[i]==0) bb/=prime[i],++num[cnt]; //记录 B 的质因子个数。
}
int ans=1;
for(int i=1;i<=n;i++){
int now=i;
for(int j=1;j<=cnt;j++)
while(now%pri[j]==0)
now/=pri[j],++tot[j];//记录其中 B 的质因子的个数。
ans=(ans*now)%b;//剩余部分直接计算即可。
}
int z=0x3f3f3f3f;
for(int i=1;i<=cnt;i++)
z=min(z,tot[i]/num[i]);
for(int i=1;i<=cnt;i++)
tot[i]-=num[i]*z;//将 B 的质因子减去殆尽。
for(int i=1;i<=cnt;i++)
for(int j=1;j<=tot[i];j++)
ans=(ans*pri[i])%b;//剩下的直接乘即可。
printf("%d\n",ans);
return 0;
}
完结撒❀。
【USACO】Cow Brainiacs的更多相关文章
- 1642: 【USACO】Payback(还债)
1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- 1519: 【USACO】超级书架
1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...
- Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers
[USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...
- 【USACO】The Cow Prom
[题目链接] 点击打开链接 [算法] tarjan求强连通分量 [代码] #include<bits/stdc++.h> #define MAXN 20005 using namespac ...
- 【CPLUSOJ】【USACO】【差分约束】排队(layout)
[题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...
- 【USACO】Dining
[题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...
- 【USACO】Optimal Milking
题目链接 : [POJ]点击打开链接 [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...
- 【USACO】 Balanced Photo
[题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...
随机推荐
- Vue.js 学习笔记之二:数据驱动开发
在 Vue.js 框架中,与 HTML 页面元素的交互方式没有像原生 JavaScript 接口那么直接,它是通过先在 HTML 元素标签中嵌入一系列类似于普通标签属性的 Vue 指令属性来绑定数据, ...
- Python正则表达式 re.sub()函数:标志位flags与参数个数问题
这两天在写爬虫程序,涉及英文文本处理,需要规范化英文标点符号的写法.正常情况下,英文句号「.」后面需要保证有且只有一个空格,但也有例外情况,比如「i.e.」.「e.g.」.「P.S.」这种.由于无法预 ...
- Magicodes.IE 2.4版本发布
今天我们发布了2.4版本,这离不开大家对Magicodes.IE的支持,我们也对大家的意见以及需求不断的进行更新迭代,目前我们的发布频率平均在一周一个beta版本,一个月一个正式版本的更新,我们欢迎更 ...
- Hello World背后的事情
Hello World是不少人学习C++的第一项内容,代码看似简单,很多东西却涉及根本 #include <iostream> using namespace std; int main( ...
- docker-管理镜像常用命令
1. docker管理镜像常用命令 指令 说明 docker run [容器 CONTAINER ID] 创建一个新的容器并运行一个命令 docker start [容器 CONT ...
- 如何win7安装tomcat
首先安装jdk,查看当前jdk版本. >java -version 显示的是1.8.0_131 为此我们安装的tomcat版本是apache-tomcat-9.0.38-windows-x64. ...
- ps 安装 ps 2017 下载 及教程(保姆式教程)
链接:https://pan.baidu.com/s/1GJHiwmxwRApFYhyNZBCQtQ 提取码:7r6u 以上是百度网盘的地址. 1.下载解压安装前先断网在安装点击set-up 软件,之 ...
- Android开发教程之密码框右侧显示小眼睛
现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套[Android进阶学习视频].[全套Android面试秘籍].[Android知识点PDF] ...
- IE下文件上传, SCRIPT5: 拒绝访问 问题
最近遇到一个比较奇葩的问题,某些ie浏览器在页面中上传文件时,无法上传.查看控制台报错: SCRIPT5: 拒绝访问. jquery-3.2.1.min.js, 行4 字符5725 .并且我的最新版I ...
- git merge 与 git rebase的区别?
一,git merge 与 git rebase的区别 1,git merge 例如: master分支合并dev分支,git将两个分支dev和master上的所有commit , 按照提交时间的先后 ...