Description



Input

Output

Sample Input
2
1 2
2 1
1 2
2 1

Sample Output
24

样例解释:

Data Constraint

分析:
对于每一维都是若干环。因为每一个维互相独立,我们每一维选了一个环,大小为 i i i, j j j, k k k, l l l,走回原点的步数是 l c m ( i , j , k , l ) lcm(i,j,k,l) lcm(i,j,k,l)。而总共的点数是 i ∗ j ∗ k ∗ l i*j*k*l i∗j∗k∗l,所以跳环要用 i ∗ j ∗ k ∗ l l c m ( i , j , k , l ) \frac{i*j*k*l}{lcm(i,j,k,l)} lcm(i,j,k,l)i∗j∗k∗l​。
我们只需找出跳环的步数,最后加上 n 4 n^4 n4即可。
设 A [ i ] A[i] A[i]为第一维,大小为 i i i的环的数目, B [ i ] , C [ i ] , D [ i ] B[i],C[i],D[i] B[i],C[i],D[i]同理,而跳环步数可以表示成,
∑ i = 1 n ∑ j = 1 n ∑ k = 1 n ∑ l = 1 n i ∗ j ∗ k ∗ l l c m ( i , j , k , l ) ∗ A [ i ] ∗ B [ j ] ∗ C [ k ] ∗ D [ l ] \sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{k=1}^{n}\sum_{l=1}^{n}\frac{i*j*k*l}{lcm(i,j,k,l)}*A[i]*B[j]*C[k]*D[l] i=1∑n​j=1∑n​k=1∑n​l=1∑n​lcm(i,j,k,l)i∗j∗k∗l​∗A[i]∗B[j]∗C[k]∗D[l]
因为不同的个数只有 n \sqrt{n} n ​个,这样做是 O ( n 2 ) O(n^2) O(n2)的。
而因为,
i ∗ j ∗ k ∗ l l c m ( i , j , k , l ) = l c m ( i , j ) ∗ l c m ( k , l ) l c m ( i , j , k , l ) ∗ i ∗ j l c m ( i , j ) ∗ k ∗ l l c m ( k , l ) \frac{i*j*k*l}{lcm(i,j,k,l)}=\frac{lcm(i,j)*lcm(k,l)}{lcm(i,j,k,l)}*\frac{i*j}{lcm(i,j)}*\frac{k*l}{lcm(k,l)} lcm(i,j,k,l)i∗j∗k∗l​=lcm(i,j,k,l)lcm(i,j)∗lcm(k,l)​∗lcm(i,j)i∗j​∗lcm(k,l)k∗l​
也就是
g c d ( i , j ) ∗ g c d ( k , l ) ∗ g c d ( l c m ( i , j ) , l c m ( k , l ) ) gcd(i,j)*gcd(k,l)*gcd(lcm(i,j),lcm(k,l)) gcd(i,j)∗gcd(k,l)∗gcd(lcm(i,j),lcm(k,l))
设 x = l c m ( i , j ) x=lcm(i,j) x=lcm(i,j), y = l c m ( k , l ) y=lcm(k,l) y=lcm(k,l),
可以看做有 g c d ( i , j ) gcd(i,j) gcd(i,j)个 x x x和 g c d ( k , l ) gcd(k,l) gcd(k,l)个 y y y然后求 g c d gcd gcd和。
我们可以设一个 l i m lim lim,大于 l i m lim lim的部分直接暴力,小于 l i m lim lim的用反演。
l i m ≈ 1 0 6 lim≈10^6 lim≈106

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#define LL long longconst int maxn=1e5+7;
const int maxp=1e6;
const LL mod=998244353;using namespace std;int n,cnt;
int a[maxn],vis[maxn];
int prime[maxp+7],not_prime[maxp+7],phi[maxp+7];
LL ans;
LL F[maxp+7],G[maxp+7],sum[maxp+7];struct rec{LL x,y;
};struct node{vector <rec> A,B;
}cir[4];void getphi(int n)
{phi[1]=1;for (int i=2;i<=n;i++){if (!not_prime[i]){prime[++cnt]=i;phi[i]=i-1;}for (int j=1;j<=cnt;j++){if (i*prime[j]>n) break;not_prime[i*prime[j]]=1;if (i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}else phi[i*prime[j]]=phi[i]*(prime[j]-1);}}
}LL gcd(LL x,LL y)
{LL r=x%y;while (r){x=y;y=r;r=x%y;}return y;
}LL lcm(LL x,LL y)
{return x*y/gcd(x,y);
}void merge(node &a,node b)
{memset(sum,0,sizeof(sum)); for (int i=0;i<a.A.size();i++){for (int j=0;j<b.A.size();j++){LL x=gcd(a.A[i].x,b.A[j].x),y=lcm(a.A[i].x,b.A[j].x);LL z=a.A[i].y*b.A[j].y%mod*x%mod;if (y<=maxp) sum[y]=(sum[y]+z)%mod;else a.B.push_back((rec){y,z});}}a.A.clear();for (int i=1;i<=maxp;i++){if (sum[i]) a.A.push_back((rec){i,sum[i]});}
}void getans(node a,node b)
{for (int i=0;i<a.A.size();i++) F[a.A[i].x]=(F[a.A[i].x]+a.A[i].y)%mod;for (int i=0;i<b.A.size();i++) G[b.A[i].x]=(G[b.A[i].x]+b.A[i].y)%mod;for (int i=1;i<=maxp/2;i++){for (int j=i+i;j<=maxp;j+=i){F[i]=(F[i]+F[j])%mod;G[i]=(G[i]+G[j])%mod;}}           for (int i=1;i<=maxp;i++) ans=(ans+F[i]*G[i]%mod*(LL)phi[i]%mod)%mod;  for (int i=0;i<a.A.size();i++){for (int j=0;j<b.B.size();j++){LL k=gcd(a.A[i].x,b.B[j].x);ans=(ans+a.A[i].y*b.B[j].y%mod*k%mod)%mod;}}for (int i=0;i<a.B.size();i++){for (int j=0;j<b.A.size();j++){LL k=gcd(a.B[i].x,b.A[j].x);ans=(ans+a.B[i].y*b.A[j].y%mod*k%mod)%mod;}}for (int i=0;i<a.B.size();i++){for (int j=0;j<b.B.size();j++){LL k=gcd(a.B[i].x,b.B[j].x);ans=(ans+a.B[i].y*b.B[j].y%mod*k%mod)%mod;}}
}int main()
{freopen("space.in","r",stdin);freopen("space.out","w",stdout);scanf("%d",&n);for (int T=0;T<4;T++){memset(sum,0,sizeof(sum));for (int i=1;i<=n;i++){scanf("%d",&a[i]);vis[i]=0;}for (int i=1;i<=n;i++){if (!vis[i]){int j=i,num=0;while (!vis[j]){vis[j]=1;num++;j=a[j];}sum[num]++;}}        for (int i=1;i<=n;i++){if (sum[i]) cir[T].A.push_back((rec){i,sum[i]});}}    getphi(maxp);merge(cir[0],cir[1]);merge(cir[2],cir[3]);getans(cir[0],cir[2]);ans=(ans+(LL)n*(LL)n%mod*(LL)n%mod*(LL)n%mod)%mod;printf("%lld\n",ans);
}

jzoj 5970.【北大2019冬令营模拟12.1】space 莫比乌斯反演相关推荐

  1. JZOJ[5971]【北大2019冬令营模拟12.1】 party(1s,256MB)

    题目 题目大意 给你一棵树,在树上的某一些节点上面有人,要用最小的步数和,使得这些人靠在一起.所谓靠在一起,即是任意两个人之间的路径上没有空的节点(也就是连在一起). N ≤ 200 N \leq 2 ...

  2. JZOJ 5977. 【清华2019冬令营模拟12.15】堆

    Description Input Output Sample Input 10 10 0 1 1 2 2 4 3 12 2 6 2 15 3 5 3 10 7 7 9 16 2 3 1 10 9 2 ...

  3. JZOJ 5984. 【北大2019冬令营模拟2019.1.1】仙人掌

    Description Input Output Sample Input 5 10 1 2 2 3 2 4 3 5 1 5 2 4 3 5 4 2 3 1 Sample Output 2060 Da ...

  4. jzoj5990. 【北大2019冬令营模拟2019.1.6】Bear (状压dp)

    题面 题解 我永远讨厌dp.jpg 搞了一个下午优化复杂度最后发现只要有一个小trick就可以A了→_→.全场都插头dp就我一个状压跑得贼慢-- 不难发现我们可以状压,对于每一行,用状态\(S\)表示 ...

  5. jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)

    这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...

  6. jzoj5984. 【北大2019冬令营模拟2019.1.1】仙人掌 (分块)

    题面 题解 数据结构做傻了.jpg 考虑每一个节点,它的儿子的取值最多只有\(O(\sqrt {m})\)种,那么可以用一个双向链表维护儿子的所有取值以及该取值的个数,那么对儿子节点修改一个值就是\( ...

  7. jzoj5989. 【北大2019冬令营模拟2019.1.6】Forest (set)

    题面 题解 为了一点小细节卡了一个下午--我都怕我瞎用set把电脑搞炸-- 观察一次\(1\)操作会造成什么影响,比如说把\(A[i]\)从\(x\)改成\(y\): \(D[x]\)会\(-1\), ...

  8. 【清华2019冬令营模拟12.8】视野

    计算几何弱渣果然就是一点感觉也没有. 题目大意: 题解: 首先考虑不删怎么做? 肯定要把点给离散,那么现在对于每一小段,要求出是哪条线段最近? 按一个顺序扫过去,每一条线段打一个加入和删除的标记. 由 ...

  9. 2018冬令营模拟测试赛(十八)

    2018冬令营模拟测试赛(十八) [Problem A]Table 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述&qu ...

最新文章

  1. Python的while循环
  2. 介绍十种数据恢复的软件工具
  3. python职能-高级Python开发工程师职位描述与岗位职责任职要求
  4. git分支/标签操作
  5. Redis入门(三)Redis的基本数据类型
  6. php自动维护,window_Win7系统中的一些自动维护计划、任务关闭、禁用方法图文教程,  windows自动维护功能会在计 - phpStudy...
  7. 第5章 见缝插针(《C和C++游戏趣味编程》配套教学视频)
  8. 修改mysql限制ip_MySQL 修改账号的IP限制条件
  9. 饿汉式单例模式,懒汉式单例模式
  10. android 音频对比,差距只有安卓?索尼Zx300a与505全方位对比
  11. PS制作火焰文字特效
  12. c++卸载工具_卸载软件同时清除软件注册表里面的信息,也许这款软件能够帮助你...
  13. 2年前我从华为外包辞职,如今干到创业公司倒闭,36岁的我该何去何从?
  14. 键盘忍者:无需鼠标即可启动任何应用程序
  15. nginx cdn加速和反向代理
  16. 小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(上)
  17. Launcher 快捷方式、文件夹等的默认设置
  18. STP文件服务器,STP
  19. Hadoop中关于datenode无法启动的解决办法
  20. 绿城x华为:抢占未来社区新风口,共绘理想生活图鉴

热门文章

  1. 新人福利——Cheat Engine功能之基础篇
  2. 导数与微分总复习——“高等数学”
  3. 【网络组网】:H3C的vSYS参考
  4. FS4067 SOP8 5V输入两节锂电池升压型充电管理芯片
  5. python 统计一篇英语文章中每个单词出现的次数
  6. vue.js 两个等号 == 和三个等号 ===的区别
  7. vuex 的实现原理
  8. 外国建筑史的学习资料
  9. 运行tomcat7w.exe,提示:指定的服务未安装unable to open the service tomcat7
  10. STC硬件主板--电子乐谱展示的设计