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 ...
随机推荐
- CNN-2: AlexNet 卷积神经网络模型
1.AlexNet 模型简介 由于受到计算机性能的影响,虽然LeNet在图像分类中取得了较好的成绩,但是并没有引起很多的关注. 知道2012年,Alex等人提出的AlexNet网络在ImageNet大 ...
- win10安装docker运行环境
转自:https://www.cnblogs.com/stulzq/p/7743667.html Docker for Windows是Docker社区版(CE)应用程序. Docker for Wi ...
- Redis(1.16)Redis监控为什么是单线程?为什么快?
[1]Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接. ...
- Word 查找替换高级玩法系列之 -- 用替换功能删除空白区域
当你遇到Word文档中时不时的出现一些空白区域的时候会怎么办呢?一个个删除吗?NO!NO!NO!!!那样也太慢了!仅使用替换功能就可以帮你一步搞定它! 下面这篇文档中含有半角空格.全角空格.不间断空格 ...
- 华为S5700系列交换机配置文件导出、导入
一.导出 配置用户名密码,使能ftp ftp server enable aaa local-user putty password cipher putty123 local-user putty ...
- VUE创建项目
Vue Cli项目搭建 vue项目需要自建服务器:node 什么是node: 用C++语言编写,用来运行JavaScript语言 node可以为前端项目提供server (包含了socket) ...
- Django之ORM表操作
ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import models def ...
- vue.js移动端app:初始配置
本系列将会用vue.js2制作一个移动端的webapp单页面,页面不多,大概在7,8个左右,不过麻雀虽小,五脏俱全,常用的效果如轮播图,下拉刷新,上拉加载,图片懒加载都会用到.css方面也会有一些描述 ...
- Http 与 Https区别
传统Http协议弊端 传统Http协议弊端是明文的,如果别人采用抓包分析可以获取到明文数据. 什么是Https协议 HTTPS(Hyper Text Transfer Protocol over Se ...
- datagrid行内编辑
编辑属性 :editor: { type: 'text'} $('#listShow').datagrid({ height : 478, pagesize : 20, pageList : [20, ...