JAVA+大数搞了一遍- -

不是很麻烦- -

/*
HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Training Contest 5
题意:
求L,R之间的好数的个数,好数要求在某个d(>=2)进制下数位是0到d-1的
分析:
d 进制下好数的个数为 d!-(d-1)! ,且满足 d^(d-1) <= K <= d^d
可知 若 N > d^d 则 1-N 包含前 d-1 个进制的所有好数
寻找零界 d 可以二分,将 N 和 d^d 比大小 计算临界的 d 进制的好数,用类似康托展开的过程
即 对于 (x0, x1, x2...xn),转化成
首位小于x0的所有排列+ 首位等于x0第二位小于x1的所有排列+.... */
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
static Scanner cin = new Scanner(System.in);
static long MOD = 998244353;
static BigInteger a[] = new BigInteger[2000];
static long F[] = new long[2000];
static BigInteger bb;
static String s;
static int [] b = new int[5005];
static int [] c = new int[5005];
static int lc, lb;
static void init() {
F[0] = 1;
for (int i = 1; i < 2000; i++) F[i] = F[i-1] * i % MOD;
for (int i = 1; i < 2000; i++) a[i] = BigInteger.valueOf(i).pow(i);
}
static int BinaryFind(){
int l = 2, r = 1999, mid = 0;
while (l <= r) {
mid = (l+r)/2;
if (bb.compareTo(a[mid]) >= 0) l = mid+1;
else r = mid-1;
}
return l;
}
static void change(int m) {
lc = 0;
while (lb > -0) {
int x = 0;
for (int i = lb-1; i >= 0; i--) {
x = x*10 + b[i];
b[i] = x/m;
x %= m;
}
c[lc++] = x; while (lb > 0 && b[lb-1] == 0) lb--;
}
}
static int[] vis = new int[5005];
static long solve(){
int m = BinaryFind();
change(m);
long ans = F[m-1] - F[1];
if (m > lc) return ans;
for (int i = 0; i < m; i++) vis[i] = 0;
for (int i = 1; i < c[lc-1]; i++)
if (vis[i] == 0)
ans = (ans + F[lc-1]) % MOD;
vis[c[lc-1]] = 1;
for (int i = lc-2; i >= 0; i--)
{
for (int j = 0; j < c[i]; j++)
if (vis[j] == 0)
ans = (ans + F[i]) % MOD;
if (vis[c[i]] == 1) break;
vis[c[i]] = 1;
if (i == 0) ans = (ans + 1) % MOD;
}
return ans;
}
public static void main(String[] args) {
init();
int t = cin.nextInt();
while ((t--) != 0) {
bb = cin.nextBigInteger();
s = bb.toString();
lb = s.length();
for (int i = 0; i < lb; i++) {
b[i] = (int)(s.charAt(lb-1-i) - '0');
}
b[0]--;
for (int i = 0; i < lb; i++) {
if (b[i] < 0) {
b[i] += 10; b[i+1]--;
}
else break;
}
while (lb > 0 && b[lb-1] == 0) lb--;
long ans = solve();
bb = cin.nextBigInteger();
s = bb.toString();
lb = s.length();
for (int i = 0; i < lb; i++) {
b[i] = (int)(s.charAt(lb-1-i) - '0');
}
ans = (MOD + solve() - ans) % MOD;
System.out.println(ans);
}
}
}

  

HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5的更多相关文章

  1. 2017 多校5 hdu 6093 Rikka with Number

    2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...

  2. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  3. HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5

    思路和任意模数FFT模板都来自 这里 看了一晚上那篇<再探快速傅里叶变换>还是懵得不行,可能水平还没到- - 只能先存个模板了,这题单模数NTT跑了5.9s,没敢写三模数NTT,可能姿势太 ...

  4. HDU 6085 - Rikka with Candies | 2017 Multi-University Training Contest 5

    看了标程的压位,才知道压位也能很容易写- - /* HDU 6085 - Rikka with Candies [ 压位 ] | 2017 Multi-University Training Cont ...

  5. HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9

    /* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...

  6. HDU 6090 Rikka with Graph —— 2017 Multi-University Training 5

    Rikka with Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. hdu 6088 Rikka with Rock-paper-scissors (2017 多校第五场 1004) 【组合数学 + 数论 + 模意义下的FFT】

    题目链接 首先利用组合数学知识,枚举两人的总胜场数容易得到 这还不是卷积的形式,直接搞的话复杂度大概是O(n^2)的,肯定会TLE.但似乎和卷积有点像?想半天没想出来..多谢Q巨提醒,才知道可以用下面 ...

  8. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

  9. 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟

    /** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...

随机推荐

  1. [转帖]Windows安全认证是如何进行的?[Kerberos篇]

    Windows安全认证是如何进行的?[Kerberos篇] NTLM 的简单看了一下 基本上了解了.. 这个KERBEROS 的看不太懂 感觉说的我也有点迷糊.. 虽然是对称加密的 但是不清不楚的.. ...

  2. [转帖]Intel 上一代 可扩展CPU的简单报价

    8.1万元人间毒物!Intel 28核铂金版Xeon 8180零售上市 http://news.mydrivers.com/1/541/541670.htm 猜你想看:英特尔 CPU处理器 Xeon ...

  3. notepad++一次多行复制粘贴到对应位置

    NodePad++一次复制多行粘贴到对应位置 有时候要写sql,但是里面有很多字段要对应上,如果要自己一个字段一个字段的去写是在有点麻烦,是不是有更好的方法做到这件事呢? 要做这件事,首先分析下我们已 ...

  4. 杜教BM递推板子

    Berlekamp-Massey 算法用于求解常系数线性递推式 #include<bits/stdc++.h> typedef std::vector<int> VI; typ ...

  5. jupyter的控件交互

    jupyter实现控件交互 jupyter notebook 是一个交互式IDE 直接上jupyter notebook界面截图

  6. Idea中maven的设置

    File->setting    输入MAVEN     看到右侧设置情况     Maven home directory 熟路本地moven 仓库目录:D:/springboot/apach ...

  7. Django-djangorestframework-渲染模块

    目录 渲染模块 渲染模块的效果 源码分析 如何自定义配置使用渲染类 自定义渲染模块 渲染模块 可以根据用户请求 URL 或 用户可接受的类型,筛选出合适的 渲染组件. reponse 数据 json ...

  8. Java 私有构造函数的使用

    被private修饰的私有构造函数无法在其他类中调用,也就是该类无法在其他类中实例化. 这种情况常用的使用场景:1.单例模式: 2.防止实例化. 一.单例模式 单例模式是一种常用的设计模式,思想是单例 ...

  9. C#向远程地址发送数据

    static string proxyIpAddress = AppConfig.GetProxyIpAddress; static string proxyUserName = AppConfig. ...

  10. Scala学习十九——解析

    一.本章要点 文法定义中的二选一.拼接.选项和重复在Scala组合子解析器中对应|.~.opt和rep 对于RegexParsers而言,字符串字面量和正则表达式匹配的是词法单元 用^^来处理解析结果 ...