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 ...
随机推荐
- [CF788B]Weird journey_欧拉回路
Weird journey 题目链接:http://codeforces.com/contest/788/problem/B 数据范围:略. 题解: 我们发现就是要求,把每条无向边拆成两条无向边,其中 ...
- [CF369E]Valera and Queries_离线_树状数组
Valera and Queries 题目链接:codeforces.com/problemset/problem/369/E 数据范围:略. 题解: 这种题,就单独考虑一次询问即可. 我们发现,包括 ...
- 认识 Spring 框架(一)
认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP( ...
- java中整数的默认为int类型的一些问题
thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...
- ARTS第六周打卡
Algorithm : 做一个 leetcode 的算法题 1.合并两个排序链表 2.树的子结构 3.二叉树的镜像 4.包含Min函数的栈 5.栈的压入.弹出 6.二叉搜索树的后序遍历 7.从上往下打 ...
- 前端通过js获取手机型号
###前段通过js获取手机型号 需求: 用户登录后记录当前的手机型号并记录 插件: mobile-detect.js插件地址 mobile-device-js插件地址 使用步骤: 获取UA信息-> ...
- 机器学习-svd实现人脸识别
加载sklearn中的人脸数据集 from sklearn.datasets import fetch_lfw_people faces = fetch_lfw_people() 执行上面的第二行程序 ...
- Luogu4081 USACO17DEC Standing Out from the Herd(广义后缀自动机)
建出广义SAM,通过parent树对每个节点求出其是否仅被一个子串包含及被哪个包含. 写了无数个sam板子题一点意思都没啊 #include<bits/stdc++.h> using na ...
- (十三)Activitivi5之流程控制网关:并行
一.概念 所谓排他网关 顾名思义 执行到该网关,会有多条线路同时并行执行,当都执行完才继续执行后面的: 二. 案例 此时当“学生请假”任务节点完成之后,如下图此时有两个任务,必须等到两个任务都完成才会 ...
- 双重检查加锁机制(并发insert情况下数据重复插入问题的解决方案)
双重检查加锁机制(并发insert情况下数据重复插入问题的解决方案) c#中单例模式和双重检查锁 转:https://blog.csdn.net/zhongliangtang/article/deta ...