P2220 [HAOI2012]簡単な問題[プライマリ数学]

タイトル説明

次のようにみんなを満たすために自分自身を考える(簡単)、少しQが意図的に簡単な質問誰もが幸せにするために、この簡単な質問が記載されています:

そこにすべてのために知られている列数[i]が自然数に1であり、N、および[i]の値を取ることができないいくつかのAのために知っている、我々はすべての要素の積の列のシリーズのために、製品の数を定義し、あなたが必要です列とMOD 1000000007の数の積のすべての可能な値を決定し、それは非常に単純ではないのですか?ハハ!

解決

数論内部のラベルが嘘(霧)であるmodはそれがあるので、それを何ですか?

この質問は、最初の観測データの範囲は非常にシンプルであり、kは、我々はそれについて大騒ぎをする、比較的小さいことがわかりました。

条件の合計に制限を見いださないために私たちの願いの影響、マイナスのkとの関係で、この複雑さに起因する制約。

仮定\(P \)の位置に追加され(私は\)\次いで、残りの位置の積

\(年数= 1 + 2 * P * P + \ cdots + N * P =(\ FRAC {N(N + 1)} {2})* P \)

任意の位置のために、それは明らかにこの事です。

次に\(ANS = {(\ {N-FRAC(N + 1)} {2})} M ^ \)

あるいはパイルアイテムを乗算することにより理解として\(ANS =(1 + 2 + \ + N-cdots)*(1 + 2 + \ + N-cdots)* \ cdots \)

合計\(m個\)キー、それはその事のトップになります。

その後、我々は制限を検討してください。

まず位置に、場所の制約によってソートされた\(私は\) 彼らがしている場合は、すべての制約、および(\ SUM)\、彼らがして答えを拒否することを確認することは容易である(合計* {(\ FRACを\ nは{ (N + 1)} {2})^ {}} * 1 MI NOW-の\)前記\(今\)を薄くする制約\(1 \ simのI-1 \) 製品。\(今\) 1の初期値、カリングを乗じた各時間(\ \ {N-FRAC(+ N-1)} {2} -sum \)

また、NOが最終結果の各位置の影響を除くため、離散。

複雑\(O(klogm klogk +)\)

私は多くのコード鬼畜を書くが、私はQWQを大物ご容赦ください。

参照コード

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#include<set>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100010
#define MOD 2520
#define E 1e-12
#define ll long long
#define mod 1000000007
#define div 500000004
using namespace std;
inline int read()
{
    int f=1,x=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
ll n,m,k,sum[N];
set<int> s[N];
struct node{
    int pos,x;
    inline bool operator<(const node &a)const{
        return a.pos>pos;
    }
}a[N];
inline ll qp(ll a,ll b){ll ans=1;for(;b;b>>=1){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;}return ans%mod;} 
int main()
{
    n=read(),m=read(),k=read();
    for(int i=1;i<=k;++i)
        a[i].pos=read(),a[i].x=read();
    sort(a+1,a+k+1);
    int cnt=1,pos=a[1].pos;
    for(int i=1;i<=k;++i){
        if(pos==a[i].pos){
            if(s[cnt].find(a[i].x)!=s[cnt].end()) continue;
            s[cnt].insert(a[i].x),sum[cnt]=(sum[cnt]%mod+a[i].x%mod)%mod;
        }
        else s[++cnt].insert(a[i].x),sum[cnt]=(sum[cnt]%mod+a[i].x%mod)%mod;
        pos=a[i].pos;
    }//脑抽写的set离散化
    ll tmp=(n%mod*(n+1)%mod*div%mod)%mod;
    ll ans=qp(tmp,m)%mod;
    ll now=1;
    for(int i=1;i<=cnt;++i){
        ans=(ans%mod-sum[i]%mod*qp(tmp,m-i)%mod*now%mod+2*mod)%mod;
        now=(now%mod*(tmp%mod-sum[i]%mod+2*mod)%mod)%mod;
    }
    printf("%lld\n",ans%mod);
    return 0;
}

おすすめ

転載: www.cnblogs.com/DarkValkyrie/p/11794173.html