2019牛客多校第三场D BigInteger——基础数论
题意:
用 $A(n)$ 表示第 $n$ 个只由1组成分整数,现给定一个素数 $p$,求满足 $1 \leq i\leq n, 1 \leq j \leq m, A(i^j) \equiv 0(mod \ p)$ 的 $(i, j)$ 对数。
分析:
$11...11 = \frac{10^n-1}{9} \equiv 0(mod \ p)$ 等价于 $10^n \equiv 1(mod \ 9p)$,当 $p \neq 2,5$ 时,有 $gcd(10, 9p)=1$,因此 $10^{\phi(9p)} \equiv 1(mod \ 9p)$。我们需要找到满足等式最小的数 $d$,也是循环节,显然 $d \ | \ \phi (9p)$,直接枚举 $\phi(9p)$ 的约数验证即可。
找到循环节 $d$ 后,我们需要知道有多少对 $(i, j)$ 满足 $d \ | \ i^j$.
对 $d$ 做质因数分解, $d = p_1^{k_1}p_2^{k_2}...p_l^{k_l}$,考虑 $j$ 固定的时候,$i$ 需要满足什么条件?$i$ 必须是 $g = p_1^{\left \lceil \frac{K_1}{j} \right \rceil} p_2^{\left \lceil \frac{K_2}{j} \right \rceil} ... \ p_l^{\left \lceil \frac{K_l}{j} \right \rceil}$ 的倍数,因此共有 $\frac{n}{g}$ 个合法的 $i$。
由于 $k_i \leq 30$,所以 $j$ 增加到30以上和 $j=30$ 的结果是一样的,枚举 $j$ 从1到30,分别计算 $g$ 即可。
当 $p=2,5$ 的时候,显然答案为0.
$\phi(9p)$ 也不必用欧拉函数计算,当 $p \neq 3$ 时,3与p互素,根据欧拉函数的积性,$\phi (9p) = \phi (9)\phi (p) = 6(p-1)$.
由于快速幂会爆long long,需要用__int128(血的教训啊,wa了好多发,枯了)
代码:
#include<bits/stdc++.h>
using namespace std; typedef long long ll; ll p, m ,n;
map<ll, ll>ma; __int128 qpow(__int128 a, __int128 b, __int128 p)
{
__int128 res = ;
while(b)
{
if(b & ) res = res * a % p;
a = (a * a) % p; //a*a会爆long long
b >>= ;
}
return res;
} ll qpow2(ll a, ll b) {
ll res = ;
while(b)
{
if(b & ) res = res * a;
a = a * a;
b >>= ;
}
return res;
} //约数枚举O(√n)
ll divisor(ll n, ll p)
{
vector<ll>res;
for (ll i = ; i * i <= n; i++)
{
if (n % i == )
{
//printf("i:%lld\n", i);
if(qpow(, i, *p) % (*p) == ) return i;
if(i != n / i) res.push_back(n / i);
}
}
for(ll i = res.size()-;i >= ;i--)
{
// printf("i:%lld\n", res[i]);
if(qpow(, res[i], *p) % (*p) == ) return res[i];
}
return ;
} //整数分解O(√n)
void prime_factor(ll n)
{
for (int i = ; i * i<= n; i++)
{
while (n % i == )
{
++ma[i];
n /= i;
}
}
if (n != ) ma[n] = ; //最多只有一个素因数大于√n
} //j固定的情况下的对数
ll OneJ(int j)
{
ll res = ;
for(auto it = ma.begin();it != ma.end();it++)
{
res *= qpow2((*it).first, (ll)ceil((*it).second * 1.0 / j));
}
return n / res;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%lld%lld%lld", &p, &n, &m);
//int fai = euler_phi(9*p);
ll k;
if(p == || p == )
{
printf("0\n");
continue;
} if(p == )
{
k = divisor(, p);
}
else k = divisor(*(p-), p); //printf("k:%lld\n", k); if(k == ) printf("0\n");
else
{ ma.clear();
ll res = ;
prime_factor(k); //printf("k:%lld\n", k); if(m < )
{
for(int i = ;i <= m;i++) res += OneJ(i);
}
else
{
for(int i = ;i <= ;i++) res += OneJ(i);
int tmp = OneJ();
res += tmp * (m - );
}
printf("%lld\n", res);
}
}
return ;
}
2019牛客多校第三场D BigInteger——基础数论的更多相关文章
- 2019牛客多校第三场 F.Planting Trees
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...
- [2019牛客多校第三场][G. Removing Stones]
题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有 ...
- [题解]Magic Line-计算几何(2019牛客多校第三场H题)
题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...
- [题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)
题目链接:https://ac.nowcoder.com/acm/contest/883/B 题意: 给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1].求子串中 ‘ ...
- 2019牛客多校第三场A Graph Games 分块思想
题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边 ...
- 启发式分治:2019牛客多校第三场 G题 Removing Stones
问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍 ...
- 2019牛客多校第三场B-Crazy Binary String(前缀和+思维)
Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #in ...
- 2019牛客多校第三场H-Magic Line
Magic Line 题目传送门 解题思路 因为坐标的范围只有正负1000,且所有点坐标都是整数,所以所有点相连构成的最大斜率只有2000,而我们能够输出的的坐标范围是正负10^9.所以我们先把这n个 ...
- 2019牛客多校第三场J-LRU management(map+双向链表)
LRU management 题目传送门 解题思路 用map索引对应地址,用双向链表维护序列. 代码如下 #include <bits/stdc++.h> #define INF 0x3f ...
随机推荐
- [转帖]hive与hbase的联系与区别:
https://www.cnblogs.com/xubiao/p/5571176.html 原作者写的很好.. 这里面简单学习总结一下.. 都是bigdata的工具, 都是基于google的bigta ...
- Spring Bean装配详解(五)
装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中. 大部分场景下,我们都会使用 Appl ...
- Ural 1029 Ministry 题解
目录 Ural 1029 Ministry 题解 题意 题解 程序 Ural 1029 Ministry 题解 题意 给定一个\(n\times m(1\le n \le10,1\le m \le50 ...
- linux awk和sed工具
慕课网链接:https://www.imooc.com/video/14508 部分示例命令 #替换passwd中的用户名和userid和gid gsed 's/\(^[a-z_-]\+\):\*:\ ...
- Python基础 第5章 条件、循环及其他语句(1)
1. print和import 1.1 打印多个参数 可用 + 连接多个字符串,可保证被连接字符串前无空格: 可用sep=“_”,自定义各种分隔符: print("I"," ...
- 一文搞懂嵌入式uboot、kernel、文件系统的关系
总览: 在linux系统软件架构可以分为4个层次(从低到高分别为): 1.引导加载程序 引导加载程序(Bootloader)是固化在硬件Flash中的一段引导代码,用于完成硬件的一 ...
- jq获取元素偏移量offset()
解释: 1 获取匹配元素在当前视口的相对偏移. 2 返回的对象包含两个整型属性:top 和 left demo1: 获取top与left var aaa = $(".aaa "); ...
- MyBatis核心组件
SqlSessionFactoryBuilder (构造器) 会根据配置或者代码来生成SqlSessionFactory SqlSessionFactory (工厂接口) 以后他来生成SqlSessi ...
- 映射重复导致的错误:Ambiguous handler methods mapped for HTTP path
转自:https://cloud.tencent.com/developer/article/1372150 出现了两个名称一样的映射,会报如下错误: 原因: 解决方法: 出现Ambiguous Ma ...
- Go 函数编程
函数的声明 在 Go 语言中,函数声明通用语法如下: func functionname(parametername type) returntype { // 函数体(具体实现的功能) } 函数的声 ...