Luogu P4270 [USACO18FEB]Cow Gymnasts (打表找规律)
题意
题解
首先我们不竖着看奶牛而是横着看。从下往上把奶牛叫做处于第0,1,2...0,1,2...0,1,2...层。那么相当于第000层的不动,第111层的平移一格,第222层的平移222格,以此类推,第iii层平移iii格。假设每一层的最小正周期为xix_ixi,则显然有xi∣ix_i|ixi∣i且xi∣nx_i|nxi∣n。因为第iii层动了iii步恰好复原,iii就一定是最小正周期的倍数;因为是nnn的环排列,所以最小正周期是nnn的因数。
那么就有xi∣gcd(i,n)x_i|gcd(i,n)xi∣gcd(i,n),又因为iii与i−1i-1i−1互质,则gcd(i,n)gcd(i,n)gcd(i,n)与gcd(i−1,n)gcd(i-1,n)gcd(i−1,n)互质,所以xix_ixi与xi−1x_{i-1}xi−1互质。
又因为为了不让第iii层的奶牛悬空,有第iii层的位置移动后必有第i−1i-1i−1层的奶牛支撑,结合互质得到,在xix_{i}xi存在的情况下,xi−1=1x_{i-1}=1xi−1=1。
意思就是说除了最上面一层,下面其它层周期均为111,也就是全都占满了,每一层都是nnn头奶牛。那么这个序列最多只能出现两个值,iii和i−1i-1i−1。
我们枚举iii,最大周期是gcd(i,n)gcd(i,n)gcd(i,n),答案就是
1+∑i=1n−1(2gcd(i,n)−1)=(∑i=1n−12gcd(i,n))−(n−2)\large1+\sum_{i=1}^{n-1}\left(2^{gcd(i,n)}-1\right)=\left(\sum_{i=1}^{n-1}2^{gcd(i,n)}\right)-(n-2)1+i=1∑n−1(2gcd(i,n)−1)=⎝⎛i=1∑n−12gcd(i,n)⎠⎞−(n−2)前面的111表示最高层是第000层,后面的表示在gcd(i,n)gcd(i,n)gcd(i,n)这一最大周期内每个值只有iii和i−1i-1i−1两种取法,所以是222的次幂,不是最大周期的情况也能包括在内。后面的111表示不能全是i−1i-1i−1,否则最高层就不是iii了。
暴力做是O(nlogn)O(nlogn)O(nlogn)的,要考虑优化。
将gcd(i,n)gcd(i,n)gcd(i,n)相等的一起处理,对于1≤x<n1\le x<n1≤x<n,gcd(i,n)=x(1≤i<n)gcd(i,n)=x(1\le i<n)gcd(i,n)=x(1≤i<n)的iii的数量为φ(n/i)φ(n/i)φ(n/i),显然。所以答案就是(∑x∣nn−12x⋅φ(n/x))−(n−2)\left(\sum_{x|n}^{n-1}2^x\cdot φ(n/x)\right)-(n-2)⎝⎛x∣n∑n−12x⋅φ(n/x)⎠⎞−(n−2)
那么搜索出所有的因数,搜索过程中可以算出φ(n/x)φ(n/x)φ(n/x),最后时间复杂度为O(n⋅logn)O(\sqrt n\cdot logn)O(n⋅logn)。logloglog是快速幂。
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 1000000007;
LL p[20], k[20], ans, a[20][40], n;
//p[i]表示第i个质因数,k[i]表示p[i]的幂
//a[i][j] = p[i]^j
int cnt;
inline LL qpow(LL a, LL b) {
LL re=1;
for(;b;b>>=1,a=a*a%mod)if(b&1)re=re*a%mod;
return re;
}
void dfs(int i, LL x, LL phi) {
if(i > cnt) {
if(x < n)
ans = (ans + 1ll * qpow(2, x) * phi % mod) % mod;
return;
}
for(int j = 0; j <= k[i]; ++j)
dfs(i+1, x*a[i][j], phi/a[i][j]/(j<k[i]?p[i]:1)*(j<k[i]?p[i]-1:1)); //计算phi(n/x)
}
int main () {
scanf("%lld", &n); LL N = n;
for(LL i = 2; i*i <= n; ++i)
if(n % i == 0) {
p[++cnt] = i;
a[cnt][0] = 1;
while(n % i == 0) {
n /= i, ++k[cnt];
a[cnt][k[cnt]] = a[cnt][k[cnt]-1] * i;
}
}
if(n > 1) p[++cnt] = n, k[cnt] = 1, a[cnt][0] = 1, a[cnt][1] = n;
n = N;
dfs(1, 1, n);
printf("%lld\n", ((ans - n + 2) % mod + mod) % mod); //记得加mod
}
事实上官方题解是这样子的 Here
Luogu P4270 [USACO18FEB]Cow Gymnasts (打表找规律)的更多相关文章
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- HDU 4861 Couple doubi (数论 or 打表找规律)
Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...
- HDU2149-Good Luck in CET-4 Everybody!(博弈,打表找规律)
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
- HDU 5795 A Simple Nim(SG打表找规律)
SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...
- hdu_5894_hannnnah_j’s Biological Test(打表找规律)
题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...
- hdu_5795_A Simple Nim(打表找规律的博弈)
题目链接:hdu_5795_A Simple Nim 题意: 有N堆石子,你可以取每堆的1-m个,也可以将这堆石子分成3堆,问你先手输还是赢 题解: 打表找规律可得: sg[0]=0 当x=8k+7时 ...
- hdu_5793_A Boring Question(打表找规律)
题目链接:hdu_5793_A Boring Question 题意: 自己看吧,说不清楚了. 题解: 打表找规律 #include<cstdio> typedef long long l ...
随机推荐
- 剑指offer36:两个链表的第一个公共结点
1 题目描述 输入两个链表,找出它们的第一个公共结点. 2 思路和方法 方法一: 用两个指针同时从两个链表的表头开始走,当走到自己的链表结尾的时候开始从另一个链表的表头开始向后走.终止条件就是两个指针 ...
- python中浅拷贝和深拷贝分析
首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变.不可变:Number(数字).String(字符串).Tuple(元组).可以变:List(列表).Dictionary ...
- LIUNX随堂学习-3 权限
1.权限分为三类:读r,写w,执行x 2.读r:可以ls改目录下的子文件名,子目录名 写w:可以在该目录下创建.删除.重命名 执行x:可以cd到该目录下 3. ll (ls -l) 下详细信息的意义 ...
- jenkins 打安卓包 cpu使用过高处理操作
登录两个控制台 打包开始后 在其中一台机器执行ps -ef |grep jenkins 找到执行打包的主进程复制pid 在另一个终端上执行 top -H -p pid 将最耗cpu的线程id转换为16 ...
- nodejs 入门学习
Node.js学习笔记——Node.js开发Web后台服务 目录 一.简介 二.搭建Node.js开发环境 2.1.安装Node.js 2.2.安装IDE开发Node.js插件 三.第一个Node ...
- Oracle VIP说明
本篇文档,描述说明VIP的作用 1.VIP全称 virtual ip 虚拟IP 2.Oracle为啥要搞个VIP 3.两节点RAC,集群单个节点故障关闭后,VIP漂移否继续对外提供服务 一.模拟RAC ...
- leetcode --165--php
class Solution { /** * @param String $version1 * @param String $version2 * @return Integer */ functi ...
- .Net Core Swagger:Actions require an explicit HttpMethod binding for Swagger 2.0
添加完Swagger包引用后运行报错:Actions require an explicit HttpMethod binding for Swagger 2.0 第一时间想到了父类控制器 没有添加 ...
- pytorch自定义网络层以及损失函数
转自:https://blog.csdn.net/dss_dssssd/article/details/82977170 https://blog.csdn.net/dss_dssssd/articl ...
- Recastnavigation 创建 off-mesh link 的潜规则
Recastnavigation 在创建off-mesh link 时,发现有的off-mesh link 无法寻路(虽然在地图上能看到off-mesh link 的连线 在Google Grou ...