【hdu6093】Rikka with Number
多校第五場的題。
首先是一個好數只在某個進制下,不會是在兩個進制下都爲好數。
另外每個進制好數的個數爲d!-(d-1)!,因爲要保證第一位不爲0.
然後就是在臨界進制下有多少個好數的問題,可以變成兩個子問題,一個是找到小於n的第一個排列數,第二個是排列數的排名。
康託展開修改一下就可以變成求這兩個問題。
具體來說就是對於某個位的數字,比它小且不在前面出現的數字作爲當前位時後面無論怎麼擺都會小於這個數,so個數×剩下位數的階乘就是排名再增加的。
最後一位要+1,第一位不能爲0。區別在於如果現在的數字是前面出現過的數字,直接break掉。
比賽的時候口胡了一下,後來覺得麻煩就否決掉了23333.
其實沒有多複雜。
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define dow(i,l,r) for(int i=r;i>=l;i--)
#define rep0(i,r) for(int i=0;i<r;i++)
#define repedge(i,x)
#define maxn 50010
#define LL long long
using namespace std; const LL mm=;
int a[maxn],b[maxn],c[maxn],num[maxn],n,len,len2;
LL f[maxn];
char s[maxn];
double maxd[maxn]; void change(char *s)
{
len=strlen(s);
rep0(i,len) a[len-i-]=s[i]-'';
} void small(int *a)
{
a[]--;
rep(i,,len-)
if (a[i]<) {
a[i+]--;
a[i]+=;
}
else break;
while (len && !a[len-]) len--;
} void tobe(int m)
{
len2=;
rep0(i,len) c[i]=a[i];
int len1=len;
while (len1) {
int now=;
dow(i,,len1-) {
now=(now*+c[i]);
c[i]=now/m;
now%=m;
}
b[len2++]=now;
if (len2>m) break;
while (len1 && !c[len1-]) len1--;
}
} LL ask(int m)
{
tobe(m);
if (len2>m) return (f[m]-f[m-]+mm)%mm;
if (len2<m) return ;
rep0(i,m) num[i]=;
LL ans=-f[m-];
dow(i,,m-) {
rep0(j,b[i])
if (!num[j]) ans=(ans+f[i])%mm;
if (num[b[i]]) break;
num[b[i]]=;
if (!i) ans++;
}
return ans;
} LL calc()
{
LL sum=;
int now;
for(now=;maxd[now+]<=len-;now++);
if (now>) sum=(f[now-]-+mm)%mm;
LL more=ask(now)+ask(now+);
sum=(sum+more)%mm;
return sum;
} int main()
{
int tt;
// freopen("1009.in","r",stdin);
// freopen("1.out","w",stdout);
scanf("%d",&tt);
f[]=;
for(int i=;i<=maxn;i++) {
f[i]=f[i-]*(LL)i%mm;
maxd[i]=log(i)*(i-)/log();
}
while (tt--) {
scanf("%s",s);
change(s);
small(a);
LL ans=-calc();
scanf("%s",s);
change(s);
ans=((ans+calc())%mm+mm);
printf("%lld\n",ans%mm);
}
return ;
}
【hdu6093】Rikka with Number的更多相关文章
- 【转】oracle数据库NUMBER数据类型
原文:http://www.jb51.net/article/37633.htm NUMBER ( precision, scale)a) precision表示数字中的有效位;如果没有指定prec ...
- 【CF245H】Queries for Number of Palindromes(回文树)
[CF245H]Queries for Number of Palindromes(回文树) 题面 洛谷 题解 回文树,很类似原来一道后缀自动机的题目 后缀自动机那道题 看到\(n\)的范围很小,但是 ...
- 【Hihocoder1413】Rikka with String(后缀自动机)
[Hihocoder1413]Rikka with String(后缀自动机) 题面 Hihocoder 给定一个小写字母串,回答分别把每个位置上的字符替换为'#'后的本质不同的子串数. 题解 首先横 ...
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- 【LeetCode】375. Guess Number Higher or Lower II 解题报告(Python)
[LeetCode]375. Guess Number Higher or Lower II 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ...
- 【LeetCode】137. Single Number II 解题报告(Python)
[LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- 【LeetCode】452. Minimum Number of Arrows to Burst Balloons 解题报告(Python)
[LeetCode]452. Minimum Number of Arrows to Burst Balloons 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https ...
- 【POJ2699】The Maximum Number of Strong Kings(网络流)
Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...
随机推荐
- angular promise $q 异步调用
Angular异步调用 Promise和$q的用法 背景 首先说明一下promise异步调用出现的背景: javascript语言是一种单线程模式,就是说一次只能够执行一个任务,如果有多个任务的话就必 ...
- 安装centos minimal 版本后的网络配置(linux)
1.修改网卡配置文件 2.重启网络服务 3.测试网络
- 十、Django之Admin
一.Django Admin 管理工具 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中 ...
- 使用Git提交与管理代码
要成为一个合格的码农,必须要有效对自己的代码进行管理,最近打算有空就整理一下自己以前写得代码,把不涉及实验室的机密的内容等放到github上,之前只知道git clone 别人的代码,希望有一天自己的 ...
- css各种鼠标手型集合
比较齐全的鼠标手型css在国内的网站上是没搜到这么全的比如说哪个禁止的手型:鼠标往下移动即可看到效果: html代码如下: <h1>Cursors</h1> <div c ...
- 数据库MySql在python中的使用
随着需要存储数据的结构不断复杂化,使用数据库来存储数据是一个必须面临的问题.那么应该如何在python中使用数据库?下面就在本篇博客中介绍一下在python中使用mysql. 首先,本博客已经假定阅读 ...
- c艹第三次作业
1.git地址,不要介意仓库名. https://github.com/b666666666666666b/elevator-schedualing 2.首先,我先说一下我是怎么实现三个电梯的. 首先 ...
- lintcode-511-交换链表当中两个节点
511-交换链表当中两个节点 给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点.保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做. 注意事项 你需要交换两个 ...
- lintcode-422-最后一个单词的长度
422-最后一个单词的长度 给定一个字符串, 包含大小写字母.空格' ',请返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 注意事项 一个单词的界定是,由字母组成,但不包含任何的空 ...
- mui.ajax与服务器(SpringMVC)传输json数据
跨域问题 PC端为了安全,所以禁止跨域.而我使用mui做移动web时,难免会使用pc浏览器进行调试.mui.ajax是允许跨域的.为了可以调试成功,需要对浏览器进行设置及.以360急速浏览器为例,设置 ...