题意

传送门

题解

首先我们不竖着看奶牛而是横着看。从下往上把奶牛叫做处于第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−1​2gcd(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&lt;n1\le x&lt;n1≤x<n,gcd(i,n)=x(1≤i&lt;n)gcd(i,n)=x(1\le i&lt;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−1​2x⋅φ(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 (打表找规律)的更多相关文章

  1. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  2. HDU 5753 Permutation Bo (推导 or 打表找规律)

    Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...

  3. HDU 4861 Couple doubi (数论 or 打表找规律)

    Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...

  4. 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 ...

  5. 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用

    转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html    ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...

  6. HDU 5795 A Simple Nim(SG打表找规律)

    SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...

  7. hdu_5894_hannnnah_j’s Biological Test(打表找规律)

    题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...

  8. hdu_5795_A Simple Nim(打表找规律的博弈)

    题目链接:hdu_5795_A Simple Nim 题意: 有N堆石子,你可以取每堆的1-m个,也可以将这堆石子分成3堆,问你先手输还是赢 题解: 打表找规律可得: sg[0]=0 当x=8k+7时 ...

  9. hdu_5793_A Boring Question(打表找规律)

    题目链接:hdu_5793_A Boring Question 题意: 自己看吧,说不清楚了. 题解: 打表找规律 #include<cstdio> typedef long long l ...

随机推荐

  1. 剑指offer36:两个链表的第一个公共结点

    1 题目描述 输入两个链表,找出它们的第一个公共结点. 2 思路和方法 方法一: 用两个指针同时从两个链表的表头开始走,当走到自己的链表结尾的时候开始从另一个链表的表头开始向后走.终止条件就是两个指针 ...

  2. python中浅拷贝和深拷贝分析

    首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变.不可变:Number(数字).String(字符串).Tuple(元组).可以变:List(列表).Dictionary ...

  3. LIUNX随堂学习-3 权限

    1.权限分为三类:读r,写w,执行x 2.读r:可以ls改目录下的子文件名,子目录名 写w:可以在该目录下创建.删除.重命名 执行x:可以cd到该目录下 3. ll  (ls -l) 下详细信息的意义 ...

  4. jenkins 打安卓包 cpu使用过高处理操作

    登录两个控制台 打包开始后 在其中一台机器执行ps -ef |grep jenkins 找到执行打包的主进程复制pid 在另一个终端上执行 top -H -p pid 将最耗cpu的线程id转换为16 ...

  5. nodejs 入门学习

    Node.js学习笔记——Node.js开发Web后台服务   目录 一.简介 二.搭建Node.js开发环境 2.1.安装Node.js 2.2.安装IDE开发Node.js插件 三.第一个Node ...

  6. Oracle VIP说明

    本篇文档,描述说明VIP的作用 1.VIP全称 virtual ip 虚拟IP 2.Oracle为啥要搞个VIP 3.两节点RAC,集群单个节点故障关闭后,VIP漂移否继续对外提供服务 一.模拟RAC ...

  7. leetcode --165--php

    class Solution { /** * @param String $version1 * @param String $version2 * @return Integer */ functi ...

  8. .Net Core Swagger:Actions require an explicit HttpMethod binding for Swagger 2.0

    添加完Swagger包引用后运行报错:Actions require an explicit HttpMethod binding for Swagger 2.0 第一时间想到了父类控制器 没有添加 ...

  9. pytorch自定义网络层以及损失函数

    转自:https://blog.csdn.net/dss_dssssd/article/details/82977170 https://blog.csdn.net/dss_dssssd/articl ...

  10. Recastnavigation 创建 off-mesh link 的潜规则

    Recastnavigation 在创建off-mesh link 时,发现有的off-mesh link 无法寻路(虽然在地图上能看到off-mesh link 的连线   在Google Grou ...