1 条题解
-
0
首先考虑木棍问题。
注意到 ,所以 。
故 是 的循环移位。
设 的最小循环节长度为 ,则 的本质不同循环移位个数为 。
直接计算最小循环节长度恰好为 的字符串个数 不简单。
所以计算存在长度为 循环节字符串个数 。显然 。
接着考虑计算 ,显然若 ,则 。(可能存在长度比 更小的循环移位)。
直接计算即可。
我写的 ,显然这个做法随便爆,不管了。
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=10000; ll n,d[N]; int m,c,ans,f[N],p=998244353; int ksm(int x,ll y){ if(y==0) return 1; int z=ksm(x,y>>1); return z=1ll*z*z%p,y&1?1ll*z*x%p:z; } signed main(){ cin>>n>>m; for(int i=1;1ll*i*i<=n;i++) if(n%i==0){ d[++c]=i; if(i*i!=n) d[++c]=n/i; } sort(d+1,d+c+1); for(int i=1;i<=c;i++) f[i]=ksm(m,d[i]); for(int i=1;i<=c;i++) for(int j=i+1;j<=c;j++) if(d[j]%d[i]==0) f[j]=(f[j]-f[i]+p)%p; for(int i=1;i<=c;i++) ans=(ans+1ll*(d[i]%p)*(d[i]%p)%p*f[i]%p)%p; return cout<<ans<<'\n',0; }
- 1
信息
- ID
- 306
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者