VMware Campus Challenge-Niuke Challenge 40 Ein kleines V und eine Gleichung (das Problem, n Bälle in m Boxen zu legen)

Kleines V und die Gleichung. Das
erste, was in dieser Frage zu berücksichtigen ist, ist das für zwei a \ sqrt {a}ein .Bevor es zu 4 a \ sqrt {4a} zusammengeführt werden kann4 a ., Wenn es 2 + 3 \ sqrt {2} + \ sqrt {3} ist2 .+3 .Dieser Typ kann nicht zusammengeführt werden, daher müssen Sie diesen m \ sqrt {m} im Voraus ändernm .Teilen Sie in die größte Zahl numn- U m ax \ sqrt {x}x .Die durch Addition erhaltene Antwort, dann der Fragetyp, wird sofort in eine klassische Frage umgewandelt: num numlege n u m Bälle innnWie viele Pläne gibt es in n Feldern? Erwägen
Sie die Verwendung vondp [i] [j] dp [i] [j]d p [ i ] [ j ] bedeutet, dass esii gibtIch Bälle, setzenjjj Boxen, und es gibt mindestens eine Kugel in jeder Box, die Summe der Anzahl der wesentlich unterschiedlichen Lösungen, wennj> i j> ij>i , dann muss es0 0 sein0 , dann benutzef [i] [j] f [i] [j]f [ i ] [ j ] bedeutet, dass esii gibtIch Bälle, setzenjjDie Gesamtzahl der Lösungen für j- Boxen zeigt, dass die Wiederholungsgleichungdp [i] [j] = f [i - j] [j], i> = j dp [i] [j] = f [ij ist ] [j], i> = jd p [ i ] [ j ]=f [ i- -j ] [ j ] ,ich>=jdp [i] [j] = 0, i <j dp [i] [j] = 0, i <jd p [ i ] [ j ]=0 ,ich<jf [i] [j] = ∑ i = 1 jdp [i] [j] f [i] [j] = \ sum_ {i = 1} ^ {j} dp [i] [j]f [ i ] [ j ]=i = 1jd p [ i ] [ j ] , wobeif [i] [j] = f [i] [j - 1] + dp [i] [j] f [i] [j] = f [i] [j- 1] + dp [i] [j]f [ i ] [ j ]=f [ i ] [ j- -1 ]+d p [ i ] [ j ]

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define rush() int T;scanf("%d",&T);while(T--)
#define mm(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define pf2(a,b) printf("%d %d\n",a,b)
#define p_f(a) printf("%d ",a)
#define pyn(a) if(a)puts("Yes");else puts("No");
#define fi first
#define se second
#define db double
#define ll long long
using namespace std;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const db eps=1e-9;
const int N=1e3+5;
const ll P=998244353;
ll dp[N][N],f[N][N],n,m,a[N],tot,f1;
int main()
{
    
    
    for(int i=1;i<N;i++)dp[0][i]=f[0][i]=1;
    for(int i=1;i<N;i++){
    
    
        for(int j=1;j<N;j++){
    
    
            if(i>=j){
    
    dp[i][j]=f[i-j][j];f[i][j]=(f[i][j-1]+dp[i][j])%P;}
            else dp[i][j]=0,f[i][j]=f[i][j-1];
        }
    }
    for(int i=1000;i>=1;i--)a[++tot]=i*i;
    cin>>n>>m;
    for(int i=1;i<=tot;i++)if(a[i]<=m&&(m%a[i]==0)){
    
    f1=tot-i+1;break;}
    cout<<f[f1][n]<<endl;
    return 0;
}

Ich denke du magst

Origin blog.csdn.net/zhouzi2018/article/details/106312032
Empfohlen
Rangfolge