题意

传送门

题解

首先我们不竖着看奶牛而是横着看。从下往上把奶牛叫做处于第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. 可能是一篇(抄来的)min25学习笔记

    可能是一篇(抄来的)min25学习笔记 一个要求很多的积性函数 我们考虑有一个积性函数,这个函数满足可以快速计算质数处的值 且质数可以写成一个多项式的形式--而且这个多项式如果强行套在合数上,满足积性 ...

  2. PAT甲级 字符串处理题_C++题解

    字符串处理题 目录 <算法笔记> 重点摘要 1001 A+B Format (20) 1005 Spell It Right (20) 1108 Finding Average (20) ...

  3. python学习-23 函数

    函数 1.函数分为:数学定义的函数和编程语言中的函数 例如: - 数学定义的函数:y=2*x+1 - 编程语言的函数: def test(x): x += 1 return x def  :定义函数的 ...

  4. Image splicing forgery detection combining coarse to refined convolutional neural network and adaptive clustering

    粗到精的卷积神经网络与自适应聚类相结合的图像拼接篡改检测 研究方向:图像篡改检测 论文出处:ELSEVIER A类 学校:西安电子科技大学网络工程学院.重庆邮电大学计算机科学与技术学院 关键字:Spl ...

  5. array_chunk — 将一个数组分割成多个

    说明 array_chunk ( array $array , int $size [, bool $preserve_keys = false ] ) : array 将一个数组分割成多个数组,其中 ...

  6. (十)mybatis之缓存

    一.缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)去查询,从缓存中进行查询,从而提高查询效率,解决了高并发系统的性能问题. 二.mybatis ...

  7. 改善C#程序的方法

    写在开头: http://www.cnblogs.com/luminji    157个建议_勘误表 一:属性 属性和方法一样.也可以是virtual和abstract. 条款2:运行时常量(read ...

  8. js的页面交互

    与html标签建立关系 //获取标签,js如何与html标签建立联系 两种方式 //1. let num = document.getElementsByClassName('d1'); consol ...

  9. css垂直居中如何实现

    利用CSS3的transform:translate .center{ width:%; position: absolute; top: %; left: %; -moz-transform: tr ...

  10. leetcode-3 最长无重复字串

    3. Longest Substring Without Repeating Characters 题面 Given a string, find the length of the longest ...