zoukankan      html  css  js  c++  java
  • AtCoder Regular Contest 064 F

    Problem Statement

    Takahashi and Aoki are going to together construct a sequence of integers.

    First, Takahashi will provide a sequence of integers a, satisfying all of the following conditions:

    • The length of a is N.
    • Each element in a is an integer between 1 and K, inclusive.
    • a is a palindrome, that is, reversing the order of elements in a will result in the same sequence as the original.

    Then, Aoki will perform the following operation an arbitrary number of times:

    • Move the first element in a to the end of a.

    How many sequences a can be obtained after this procedure, modulo 109+7?

    Constraints

    • 1≤N≤109
    • 1≤K≤109

    Input

    The input is given from Standard Input in the following format:

    N K
    

    Output

    Print the number of the sequences a that can be obtained after the procedure, modulo 109+7.


    Sample Input 1

    Copy
    4 2
    

    Sample Output 1

    Copy
    6
    

    The following six sequences can be obtained:

    • (1,1,1,1)
    • (1,1,2,2)
    • (1,2,2,1)
    • (2,2,1,1)
    • (2,1,1,2)
    • (2,2,2,2)

    Sample Input 2

    Copy
    1 10
    

    Sample Output 2

    Copy
    10
    

    Sample Input 3

    Copy
    6 3
    

    Sample Output 3

    Copy
    75
    

    Sample Input 4

    Copy
    1000000000 1000000000
    

    Sample Output 4

    Copy
    875699961
    

    用1-k填序列,序列可以左移n次变为回文

    不考虑移位总共有k^(n/2)个回文,所以就是一个容斥问题了

    若回文串的最小循环节长度为c,经过c次操作后,得到c个序列
    当c为偶数时,重复数为一半,奇数时,无重复 

    所以这个问题就解决了,其循环节只可能是其因子

    #include <bits/stdc++.h>
    using namespace std;
    const int N=2010,MD=1e9+7;
    int v[N],f[N];
    int Pow(int x,int y)
    {
        int ans=1;
        for(;y;x=x*1LL*x%MD,y>>=1)if(y&1)ans=1LL*ans*x%MD;
        return ans;
    }
    int main()
    {
        int n,k,tot=0,ans=0,i;
        cin>>n>>k;
        for(i=1; i*i<n; i++)
            if(n%i==0)v[tot++]=i,v[tot++]=n/i;
        if(i*i==n)v[tot++]=i;
        sort(v,v+tot);
        for(int i=0; i<tot; i++)
        {
            f[i]=Pow(k,(v[i]+1)/2);
            for(int j=0; j<i; j++)if(v[i]%v[j]==0) f[i]=(f[i]-f[j])%MD;
            if(v[i]&1) ans=(ans+1LL*v[i]*f[i])%MD;
            else ans=(ans+v[i]*1LL*Pow(2,MD-2)%MD*f[i])%MD;
        }
        cout<<(ans+MD)%MD;
    }
  • 相关阅读:
    Zabbix,Nagios,OneAPM Servers 安装部署大比拼
    Android 手把手带你玩转自己定义相机
    Sublime Text3 快捷键
    超具体Windows版本号编译执行React Native官方实例UIExplorer项目(多图慎入)
    poj 1664 放苹果(递推)
    在HyperLedger Fabric中启用CouchDB作为State Database
    HyperLedger Fabric 1.0的Transaction处理流程
    如何将Bitcoin比特币区块链数据导入关系数据库
    在Ubuntu中部署并测试Fabric 1.0 Beta
    在Ubuntu上快速搭建基于Beego的RESTful API
  • 原文地址:https://www.cnblogs.com/BobHuang/p/9607224.html
Copyright © 2011-2022 走看看