题意描述

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的更多相关文章

  1. 1642: 【USACO】Payback(还债)

    1642: [USACO]Payback(还债) 时间限制: 1 Sec 内存限制: 64 MB 提交: 190 解决: 95 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 &quo ...

  2. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  3. 1519: 【USACO】超级书架

    1519: [USACO]超级书架 时间限制: 1 Sec 内存限制: 64 MB 提交: 1735 解决: 891 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 Farmer Jo ...

  4. Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers

    [USACO]1.1.2 贪婪的礼物送礼者 Greedy Gift Givers 题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for th ...

  5. 【USACO】The Cow Prom

    [题目链接] 点击打开链接 [算法] tarjan求强连通分量 [代码] #include<bits/stdc++.h> #define MAXN 20005 using namespac ...

  6. 【CPLUSOJ】【USACO】【差分约束】排队(layout)

    [题目描述] Robin喜欢将他的奶牛们排成一队.假设他有N头奶牛,编号为1至N.这些奶牛按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多头奶牛挤在同一位置的情况(也就是说,如果我们认 ...

  7. 【USACO】Dining

    [题目链接] [JZXX]点击打开链接 [caioj]点击打开链接 [算法] 拆点+网络流 [代码] #include<bits/stdc++.h> using namespace std ...

  8. 【USACO】Optimal Milking

    题目链接 :        [POJ]点击打开链接        [caioj]点击打开链接 算法 : 1:跑一遍弗洛伊德,求出点与点之间的最短路径 2:二分答案,二分”最大值最小“ 3.1:建边,将 ...

  9. 【USACO】 Balanced Photo

    [题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...

随机推荐

  1. 剑指offer-链表&数组

    1.圆圈中最后剩下的数 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...

  2. 005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介

    005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介 Eclipse是一款集成开发工具--IDE. 集成开发环境(IDE,Integrated ...

  3. 099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类

    099 01 Android 零基础入门 02 Java面向对象 03 综合案例(学生信息管理) 02 案例分析及实现 03 编写并测试Student类 本文知识点:编写并测试Subject类 说明: ...

  4. spring-boot-route(十)多数据源切换

    前面我们已经介绍了三种方式来操作数据库,在实际开发中,往往会出现一个服务连接多个数据库的需求,这时候就需要在项目中进行灵活切换数据源来完成多个数据库操作.这一章中,我们使用jdbcTemplate来学 ...

  5. TP5上传图片到七牛云,并且删除七牛云的图片

    一,通过composer 下载七牛云 sdk composer require qiniu/php-sdk 二,手动下载七牛云sdk 1,https://developer.qiniu.com/kod ...

  6. 回炉重造系列-C# func and action委托是什么?

    如题: C# func and action委托是什么? 1) 回答这个问题之前,我们需要了解什么是委托(英文 Delegate )? 为了便于理解,再往前推一步,回到c语言时代,指针的概念. 什么是 ...

  7. Python+Appium自动化测试(12)-通过坐标定位元素

    在使用appium做app自动化测试的过程中,可能会遇到元素的属性值不是唯一的情况,导致不能通过find_element_bi_xx()方法定位元素,这个时候我们就可以通过坐标来定位元素. 1,通过绝 ...

  8. GML与KML的区别

    1.GML是基于XML的地理信息的传输.存储编码,它包括空间的和非空间的地理特征和地理范畴.GML是空 间数据编码.传输.存储.发布的国际标准KML是一个OGC标准 2.GML专注于地理信息的结构与内 ...

  9. MeteoInfoLab脚本示例:创建netCDF文件(合并文件)

    在MeteoInfoLab中增加了创建netCDF文件并写入数据的功能,这里利用合并多个netCDF文件为一个新的netCDF文件为例.1.创建一个可写入的netCDF文件对象(下面用ncfile表示 ...

  10. day22 函数整理

    # 1.计算 年月日时分秒 于现在之间差了多少 格式化时间 # 现在 # 某一个年月日时分秒 参数 # import time # def get_time(old_t,fmt = '%Y-%m-%d ...