经典的等价类计数问题,我们设 f(x) 为环长为 x 的时候的花环种类,那么答案显然等于 1/n  *  Σf( gcd (i,n) * [gcd(i,n)!=1] * [i>=0&&i<n])

特殊的,因为循环节不能只有一个,所以gcd不能是1。(但是注意特判n==1的情况)

又因为n很大,所以我们不能枚举gcd一个一个算,必须把n质因数分解之后用Φ算,这里推一波狮子就好啦。。。。

然后就是f()的计算方法啦。。。首先我们设 g(x) = f(x) / k,也就是当环上第一个花颜色已经确定的方案数,显然 g(x) = (k-1)^(x-1) - g(x-1)       (x>2)

x<=2的话g很好手算啦。。。所以考虑x>2的时候,从第2到第n个花都要和前面不同色,所以是 (k-1)^(n-1)。又因为这样会把第1个花和第n个花同色的方案算进来,所以还要减去g(x-1)  (相当于把第n个花去掉,只剩n-1个花成环,仍然要求相邻不同色)。

这样通过递推式直接矩阵做的话会凉掉,因为自带8的大常数。。。。。

不过介于这个递推式太jb简单了,我们都可以直接用等比数列求和求出它的通项。。。。 就是 g(x) =( (k-1)^n + (k-1) * (-1)^n )/k , 所以f(x) =  (k-1)^n + (k-1) * (-1)^n.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<cstring>
#define ll long long
using namespace std;
const int ha=998244353,P=ha-1;
inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=ha)x-=ha;}
inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha; return an;} int T,k,ans,c[233],num=0;
ll n,d[233]; inline int g(ll x){
return add(ksm(k-1,x%P),(x&1)?ha-(k-1)%ha:(k-1)%ha);
} void dfs(int x,ll y,ll phi){
if(x==num){ if(y!=n) ADD(ans,phi%ha*(ll)g(n/y)%ha); return;}
dfs(x+1,y,phi); y*=d[x+1],phi*=d[x+1]-1;
for(int u=1;u<=c[x+1];u++,y*=d[x+1],phi*=d[x+1]) dfs(x+1,y,phi);
} inline void solve(){
if(n==1){ ans=k%ha; return;} ll u=n; for(int i=2;i*(ll)i<=n;i++) if(!(u%i)){
c[++num]=0,d[num]=i;
while(!(u%i)) u/=i,c[num]++;
} if(u!=1) c[++num]=1,d[num]=u; dfs(0,1,1); ans=ans*(ll)ksm(n%ha,ha-2)%ha;
} int main(){
freopen("necklace.in","r",stdin);
freopen("necklace.out","w",stdout); scanf("%d",&T);
while(T--){
scanf("%lld%d",&n,&k),ans=0;
num=0,solve(),printf("%d\n",ans);
} return 0;
}

  

small test on 5.30 morning T3的更多相关文章

  1. SHOI2016游记&滚粗记&酱油记

    Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. ...

  2. 8天玩转并行开发——第二天 Task的使用

    原文 8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...

  3. 我不知道你是在一个多线程out该--【ITOO】

    仍向系统负载作出太慢.卡而发愁太?我不知道多线程,你们out该.最近花了大约两三天.多-threaded.通过团队的交流,多线程有更深入的思考.希望可以加入ITOO目里面,优化一下系统性能. 概念 线 ...

  4. PKUWC 2018 滚粗记

    day0 上午居然考了一场考试,大爆炸,攒了一波RP,下午也没有心思去落实题目,而是一心去搞颓废,到了晚上看时间还早,于是就看了一波上午考试的Solution,懵逼.jpg day1 上午考数学,前一 ...

  5. djiango的模板语言(template)

    老师的博客:http://www.cnblogs.com/liwenzhou/p/7931828.html 官方文档:https://docs.djangoproject.com/en/1.11/re ...

  6. Django模板语言相关内容

    Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...

  7. Django模板语言初识

    一.Django框架简介 1.MVC框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...

  8. NOI2018场外游记

    鬼晓得APIO以后我经历了些什么 Day 0 好像没什么要记的 Day 1 下午去参加开幕式 神tm大型落地柜装风扇空调下放冰块 开幕式,,,hot chocolate是真的hot(强制在线?卡常?) ...

  9. django 更新 模板语言

    Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...

随机推荐

  1. 文件格式转换神器-pandoc

    By francis_hao    Mar 11,2017 介绍 如果你需要在各种类型的文件中穿梭,那么你需要这把瑞士军刀-pandoc 它可以将各种常见的不常见的文件类型转换成另一种,我感兴趣的是在 ...

  2. android studio的弹出层

    <activity android:name=".SecondActivity" android:theme="@style/Theme.AppCompat.Dia ...

  3. CSS样式实现溢出超出DIV边框宽度高度的内容自动隐藏方法

    CSS样式实现溢出超出DIV边框宽度高度的内容自动隐藏方法 平时我们布局时候,有的文字内容多了会超过溢出我们限制的高度,有的图片会撑破DIV,让网页错位变乱. 这样我们就需要解决如何使用CSS来超出设 ...

  4. 设计模式开篇综述(Java)

    设计原则是规范,设计模式是技巧.如果在项目中能够灵活运用这些基础知识,那么我相信一定会得到意想不到的收获. 接下来的时间里,我将继续学习设计模式,将对每一个设计模式从以下几点进行分析和学习,如有不妥当 ...

  5. iOS 控制台打印unicode 转中文汉字 UTF8String

    今天查看代码数据结构,就在控台直接打印了,soGa,我看到了什么!!!! 于是乎想到了不对劲,不对呀,之前打印都是 UTF8String的呀,怎么会这样,百思不得其姐,看了一下封装的网络类,SoGa, ...

  6. 【BZOJ2301】【HAOI2011】Problem b [莫比乌斯反演]

    Problem b Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 对于给出的n个询问,每次 ...

  7. 【洛谷 P1645】 序列 (差分约束)

    题目链接 差分约束. 设\(s[i]\)表示前\(i\)个位置有多少个数,那么对于一个限制条件\((L,R,C)\),显然有 \[s[R]-s[L-1]>=C\] 于是连一条\(L-1\)到\( ...

  8. WebSocket最简易理解,term.js插件的使用

    介绍WebSocket WebSocket我想大家并不陌生,无论你的的工作中是否用到了它,都或多或少听说过,它是h5中新增的,在某些方面可以很好的替代我们一直沿用的ajax技术,甚至更加的出色.但是它 ...

  9. python—用for循环、while循环和一句话打印九九乘法表

    用for循环打印九九乘法表: for i in range (1,10): for j in range(1,10): print(j,"x",i,"=",i* ...

  10. Windows 的GUID

    GUID(全称:Globally Unique Identifier),是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况下,任何 ...