题意:

用  $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——基础数论的更多相关文章

  1. 2019牛客多校第三场 F.Planting Trees

    题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...

  2. [2019牛客多校第三场][G. Removing Stones]

    题目链接:https://ac.nowcoder.com/acm/contest/883/G 题目大意:有\(n\)堆石头,每堆有\(a_i\)个,每次可以选其中两堆非零的石堆,各取走一个石子,当所有 ...

  3. [题解]Magic Line-计算几何(2019牛客多校第三场H题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...

  4. [题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/B 题意: 给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1].求子串中 ‘ ...

  5. 2019牛客多校第三场A Graph Games 分块思想

    题意:给你一张无向图,设s(x)为与x直接相连的点的集合,题目中有两种操作: 1:1 l r 将读入的边的序列中第l个到第r个翻转状态(有这条边 -> 没这条边, 没这条边 -> 有这条边 ...

  6. 启发式分治:2019牛客多校第三场 G题 Removing Stones

    问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍 ...

  7. 2019牛客多校第三场B-Crazy Binary String(前缀和+思维)

    Crazy Binary String 题目传送门 解题思路 把1记为1,把0记为-1,然后求前缀和,前缀和相等的就说明中间的01数一样.只要记录前缀和数值出现的位置即可更新出答案. 代码如下 #in ...

  8. 2019牛客多校第三场H-Magic Line

    Magic Line 题目传送门 解题思路 因为坐标的范围只有正负1000,且所有点坐标都是整数,所以所有点相连构成的最大斜率只有2000,而我们能够输出的的坐标范围是正负10^9.所以我们先把这n个 ...

  9. 2019牛客多校第三场J-LRU management(map+双向链表)

    LRU management 题目传送门 解题思路 用map索引对应地址,用双向链表维护序列. 代码如下 #include <bits/stdc++.h> #define INF 0x3f ...

随机推荐

  1. ubuntu 上不了网,解决方案之一

    每个人的情况可能不同,我的情况是由于强制关机网卡坏了,网络没有自动分配ip,ens33网卡没有ip,这时得手动启动命令 sudo dhclient 来自动获取ip地址.这里要感谢这篇博客,让我意识到自 ...

  2. 使用网关zuul过滤器登录鉴权

    使用网关zuul过滤器登录鉴权     1.新建一个filter包         filte有很多种 pre.post.     2.新建一个类LoginFilter,实现ZuulFilter,重写 ...

  3. 1204: 移位运算(C)

    一.题目 http://acm.wust.edu.cn/problem.php?id=1204&soj=0 二.分析 无符号短整数关键字为:unsigned short: 无符号短整数长为2字 ...

  4. sysbench安装和测试

    1.首先安装依赖 yum install mariadb-devel yum install automake libtool –y 2.下载安装包 wget https://github.com/a ...

  5. sit、qas、dev、pet

    SIT: System Integrate Test 系统整合测试 QAS: Quality Assurance system 质量保证 DEV: Development 开发 PET: Perfor ...

  6. Mariadb/Mysql 主从复制(1)

    一.原理 mysql的主从数据同步是一个异步复制过程,需要master开启bin-log日志功能,bin-log记录了master库中的增.删.修改.更新操作的sql语句,整个过程需要开启3个线程,分 ...

  7. hdu 1875 最小生成树 prime版

    最小生成树prime版 大致的步骤 首先选取一个到集合最近的点 然后标记起在集合内部 然后更新最短距离 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    ...

  8. (七)装配Bean(1)

    针对给接口提供哪一个具体的实现,也就是装配哪一种具体的实现bean,在Spring中提供了多种方式,主要包括3种: 一.隐式的bean发现机制和自动装配(自动化装配bean) 二.在Java类中进行显 ...

  9. (二)XML基础(2)

    三.解析 服务端解析 JDK:            DOM            SAX            JAXB    java and xml Binding 开源(一般都是用开源的)   ...

  10. C++万能头文件<bits/stdc++.h>的内容与优缺点

    最近发现了一个C++的头文件bits/stdc++.h,听说这是一个几乎包含了所有C++库函数的头文件,就想更深入的了解一下,下面是头文件内容 // C++ includes used for pre ...