[Gdgzezoi]問題B:愛は毎日ジョギング

説明

実行していることは非常に興味深いですし、ゲームの「実行中の毎日愛」というセクションを作ることにしたという小さなC学生。「愛が実行されている毎日は、」タスクのパンチを完了するために、時間に毎日ライン上の選手を必要とするゲームを開発することです。

これは、n個のノードおよびツリーストリップのN-1側を含むゲームマップとして見ることができ、各エッジは、2つのノードを接続し、任意の2つのノードの存在は、各パスに到達することができます。1からnまでの連続した正の整数のツリーノード番号。

プレーヤーのm個の数、Iは、Si、エンドポイントはTiである点を開始プレイヤーがあります。パンチ毎日タスクを開始するには、すべてのプレイヤーが同時に起動したときにプレイヤーがさえ完了後縁までの彼の開始点から0秒は、フィニッシュラインへの最短経路に沿って自分のエンドRANに向かって連続して、毎秒の速度を実行していますパンチタスク。(マップが木なので、みんなのパスが一意になるように)

小さなC活性は、各ノードが観測者を配置しているので、ゲームを知ってほしいです。最初Wjは秒を選択するために、プレイヤーを観察する観察者のノードjにおける、プレイヤーは、プレイヤーが点j Wjを秒で正確に達し服用場合に限り、オブザーバーを観察することができます。

しかし、ゲームを作るにはまっ小さなCのために、彼は完全にナショナルチームの一つとして自分自身を忘れてしまった、彼は仕事のタイトルを完了するための156待機があります。仕事オフに行く別の日、彼は行っていなかったタイトル。彼はすぐに、最も簡単な質問の外観を拾いました。

ストリングは、いわゆるサイクリックシフトの長さによって、巡回シフト後に得られたNパリンドローム配列であることができるように「整数Nを考えると、あなたは、K列の1の間の整数であり、どのくらいのキャラクタ・セットの決定しますそれは、「1221」のような文字列の最後に接頭文字列(空であってもよい)、サイクリックシフトは、「1122」4つの文字列、「1221」、「2211」、「2112」とすることができるためである。結果モジュロ109 + 7」

チームはCCF小さなCがキャンセルされた資格を維持するために、あなたは今、この質問で彼を助けます。

入力

最初の行は二つの整数N、Kが含まれています

出力

出力列の数は、109の+ 7モジュロ結果の条件を満たすために。
サンプル入力

サンプル入力1

4 2

サンプル入力2

1 10

サンプル入力3

6 3

サンプル入力4

1000000000 1000000000
サンプル出力

サンプル出力1

6

サンプル出力2

10

サンプル出力3

75

サンプル出力4

875699961

ヒント

最初のサンプルでは、​​ "1111"、 "1122"、 "1221"、 "2211"、 "2112"、 "2222" 6対象の文字列があります。

データ範囲:
1≦N、K≤109

10.サブタスクは1≤N、K≤10を満たすために存在します。
20分プレゼンスサブタスク(サブタスクに依存しない)、満足1≤N、K≤2000。

思考

無回転限界状況がある場合、まず検討し
、その後、理論的に乗算N M、回転、(N / 2)明らかにされていないが、明らかになり、再カウントが

パリンドロームタイトル文字列の数の再カウントがでお互いに到達するための方法かもしれないので、理由は
我々だけどのように多くのステップのようになり、次の回文回文文字列に、各文字列を計算する必要があり、その後

文字列が偶数であれば、ステップの数とこのサイクルの弦部が長さに関連して見つけることは容易では、ステップの数は、長さ/ 2であり、そうでなければ、サイクル長部

今問題は、各区間の決定サイクル長ループ部は、すべての文字列の最小に対応する円形断面であるようなものであるに対応する文字列の数となる
Fを配置[X]は、文字xの区間の最小周期を表しますプログラム番号文字列は、その後、F [X] =((X + 1)/ 2)M 、次に小さい円形断面を差し引きます

コード

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
const int N=2e5+20;
vector<ll> v;
ll n,k,f[2500];
ll power(ll x,ll n)
{
    ll s=1;
    while(n)
    {
        if(n&1) s=(s*x)%mod;
        n>>=1;
        x=(x*x)%mod;
    }
    return s;
}
void init()
{
    v.clear();
    for(ll i=1;i*i<=n;i++)
    {
        if(n%i==0)
        {
            v.push_back(i);
            if(i*i!=n) v.push_back(n/i);
        }
    }
    sort(v.begin(),v.end());
}
int main()
{
    scanf("%d%d",&n,&k);
    init();
    ll ans=0;
    for(int x=0;x<v.size();x++)
    {
        f[x]=power(k,(v[x]+1)/2);
        for(int y=0;y<x;y++)
        {
            if(v[x]%v[y]==0) f[x]=(f[x]-f[y]+mod)%mod;  
        }   
        if(v[x]%2) ans=(ans+(f[x]*v[x])%mod)%mod;
        else ans=(ans+(f[x]*v[x]/2)%mod)%mod;
    }
    printf("%lld",ans);
}

703元記事公開 ウォンの賞賛392 ビューに14万+を

おすすめ

転載: blog.csdn.net/Eric1561759334/article/details/100835972