NOIP模擬測試39,思維禁錮專場「工業題·玄學題·卡常題」

工業題

題解

抱歉,題解沒時間寫了

 

代碼

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 6666666
#define mod 998244353
ll jie[A],ni[A],acnt[A],bcnt[A];
ll fheng[A],fshu[A];
ll n,m,a,b;
ll meng(ll x,ll k){
    ll ans=1;
    for(;k;k>>=1,x=x*x%mod)
        if(k&1)
            ans=ans*x%mod;
    return ans;
}
ll C(ll x,ll y){
    return jie[x]*ni[x-y]%mod*ni[y]%mod;
}
int main(){
//    freopen("a_sample2.in","r",stdin);
    scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
    a%=mod,b%=mod;
    jie[0]=1;ni[0]=1;
    acnt[0]=bcnt[0]=1;
    for(ll i=1;i<=n+m;i++)
        jie[i]=jie[i-1]*i%mod,acnt[i]=acnt[i-1]*a%mod,bcnt[i]=bcnt[i-1]*b%mod;
    ni[n+m]=meng(jie[n+m],mod-2);
    for(ll i=n+m-1;i>=1;i--)
        ni[i]=ni[i+1]*(i+1)%mod;
    for(ll i=1;i<=n;i++)
        scanf("%lld",&fheng[i]),fheng[i]%=mod;
    for(ll j=1;j<=m;j++)
        scanf("%lld",&fshu[j]),fshu[j]%=mod;
    ll ans=0;
    for(ll i=n;i>=1;i--){
//        printf("acnt=%lld bcnt=%lld ")
//        printf("fheng[]=%lld n-i+m=%lld m=%lld i=%lld c=%lld acnt=%lld bcnt=%lld\n",fheng[i],n-i+m,m,i,C(n-i+m,m),acnt[m],bcnt[n-i]);
        ans=(ans+fheng[i]*((acnt[m]%mod*bcnt[n-i]%mod)%mod)%mod*C(n-i+m-1,m-1)%mod)%mod;
    }
    for(ll i=1;i<=m;i++){
//        printf("fheng[]=%lld n-i+m=%lld m=%lld i=%lld c=%lld acnt=%lld bcnt=%lld\n",fshu[i],n-i+m,m,i,C(n-i+m,m),acnt[m-i],bcnt[n]);
        ans=(ans+fshu[i]*((acnt[m-i]%mod*bcnt[n]%mod)%mod)%mod*C(n-i+m-1,n-1)%mod)%mod;
    }
    printf("%lld\n",ans);
}
View Code

玄學題

題解

題目中說求$\sum\limits_{i=1}^{i<=n}(-1)^{\sum\limits_{j=1}^{j<=m} d(i*j)}$ $d$表示約數個數

$(-1)^{\sum\limits_{j=1}^{j<=m} d(i*j)}$只和奇偶性有關,如果$d(i*j)$爲偶數,那麼它是沒用,偶+偶=偶,偶+奇=奇

那麼只考慮約數個數爲奇就可以了,發現約數個數爲奇當且僅當爲完全平方數

我們把$i$ 拆成 $p*q^2$($p$ 沒有平方因子),那 $j$ 必須有 $p*r^2$ 的形式,所以對於每個 $i$,都有 $sqrt(\frac{m}{p})$ 個 $j$ 產生貢獻。

可以埃篩(需要卡常)可以線篩

我用的埃篩

代碼

#include<bits/stdc++.h>
using namespace std;
#define ll int
#define A 11111111
long long m,n,ans;
ll a[A];
int main(){
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++)
        a[i]=i;
    ll haha=sqrt(n);
    for(ll i=haha;i>=2;i--){
        ll now=i*i;
        for(ll j=now;j<=n;j+=now){
            while(a[j]%now==0)
                a[j]/=now;
        }
    }
    for(ll i=1;i<=n;i++){
        long long now=m/a[i];
        now=sqrt(now);
        if(now&1) ans--;
        else ans++;
    }
    printf("%lld\n",ans);
}
View Code

卡常題

題解

代碼

 

考試經歷

🕊

$t1$沉迷打表

範圍很大,我覺得可能是$n+m$的

我總覺得$f[n][m]$可拆,拆成$w1*(?*a*?*b)*f[n][0]+w2*(?*a*?*b)f[n-1][0]+.......w.*(?*a*?*b)f[0][m]$

$?$很簡單,可以推出來$a$,$b$係數,然後我就開始推總體系數$w$

然後我就打了$75$分鐘表,

當然也有一丁點收穫

1
1 2
1 3 6
1 4 10 20
1 5 15 35 70
1 6 21 56 126 252
1 7 28 84 210 462 924

$update$

這個表就是組合數表,呵呵.終於認清自己傻逼本質

一直到$20$行我只截取了7行

然而並沒有什麼卵用,

這個式子屁用沒有

然後開始想$t2$

$t2$讓我想起了

     God Knows

然後我開始想$區間dp$

然後我想了很長時間,依然沒有任何收穫

轉移起來跟.一樣

然後看$t3$,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章