1 条题解

  • 0
    @ 2025-8-24 22:07:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Polarisx
    一位努力不落后的 NPC

    搬运于2025-08-24 22:07:29,当前版本为作者最后更新于2025-05-26 20:54:57,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    思路

    首先题目要求 $\frac{A}{K^i} -\lfloor\frac{A}{K^i}\rfloor>\frac{A}{K^N}$,经过一定转换后可得到 AmodKi>AKNiA\bmod K^i >\frac{A}{K^{N-i}},这种形式的式子让我们不难想到将 AA 看成一个长度为 NNKK 进制数,也就是对于每个 ii,均满足该 KK 进制数的后 ii 位大于它的前 ii 位。

    问题相当于求有多少个长度为 NN,字符集为 KK,其后缀数组满足 rank1=1rank_1=1 的方案数,容易发现:

    • 合法的串不存在整周期。
    • 不存在整周期的串一定存在一个循环位移串满足条件。

    于是计数,令 fif_i 表示长度为 ii 串中有多少合法的串,有转移:

    fi=kiji,jifjf_i=k^i-\sum_{j\mid i,j\not=i} f_j

    最后得到的 fnf_n 每个合法串会重复计算 nn 遍,所以最后除个 nn 即可,直接做是 O(τ(n2))\mathcal O(\tau(n^2)),可以优化到 O(τ(n)ω(n))\mathcal O(\tau(n)\omega(n))

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int Mod=1e9+7;
    int n,k;
    vector<int>divs;
    map<int,int>f;
    
    inline ll ksm(ll a,int b,int mod){
    	ll z=1;
    	while(b){
    		if(b&1) z=z*a%mod;
    		a=a*a%mod;
    		b>>=1;
    	}
    	return z;
    }
    
    int main(){
    	scanf("%d%d",&n,&k);
    	for(int i=1;i*i<=n;i++){
    		if(!(n%i)){
    			divs.emplace_back(i);
    			if(i*i!=n) divs.emplace_back(n/i);
    		}
    	} 
    	sort(divs.begin(),divs.end());
    	for(auto i:divs){
    		f[i]=ksm(k,i,Mod);
    		for(auto j:divs)
    			if(!(i%j) and i!=j)
    				f[i]=(f[i]-f[j]+Mod)%Mod;
    	}
    	printf("%lld",f[n]*ksm(n,Mod-2,Mod)%Mod);
    		
    
    
    	system("pause");
    	return 0;
    }
    
    • 1

    信息

    ID
    3691
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者