這題口胡起來真簡單。。。
先來考慮∑m
i=1x
i≤n,
xi≥0
的整數個數
這可以用插板法證明是(n
+mm)
對於原問題,乙個經典做法是容斥,每次列舉一些數一定超過上界,其他數任意。所以答案可以表示為:∑s
∈u(−
1)|s
|(n+
c∗|s
|−|s
|−∑x
∈sbx
+mm)
(這裡要滿足n+
c∗|s
|−|s
|−∑x
∈sbx
>
0 )
可以發現,(n
+mm)
是乙個關於
n 的
m次多項式,所以可以只求每種方案的k次方的和。
所以可以先列舉|s
| ,然後就能將n+
c∗|s
|−|s
| 算出來。預處理乙個dp
(i,j
,k) 表示1~i位選了j個他們的k次方的和是多少。然後考慮列舉第乙個不同的數字是哪個,然後算一下。。。
複雜度o(m
4)
#include
#define maxn 60
#define mod 998244353
using namespace std;
int c[maxn][maxn],ans,dp[maxn][maxn][maxn],m,b,c;
int a[maxn],im,b[maxn],n,q[maxn],s,len,r[maxn];
char s[maxn*maxn];
int qpow(int a,int b)
int getdiv(int b)
while(n&&!s[n])n--;
return sum;
}bool add(int c)
void print(int ans)
void cal(int i,int j,int nz)
int main()
for(int i=1,ret=1;i<=n&&ret;++i)
if(s[i]-ret<0)s[i]=10+s[i]-ret,ret=1;
else
s[i]-=ret,ret=0;
while(n&&!s[n])n--;
while(n)q[++len]=getdiv(b);
for(int i=0;i<=m;++i)
for(int j=*c[i]=1;j<=i;++j)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
im=1,b[0]=1;
for(int i=1;i<=m;++i)b[i]=1ll*b[i-1]*b
%mod;
for(int i=1;i<=m;++i)im=1ll*im
*i%mod;
im=qpow(im,mod-2);
memset(a,0,sizeof(a)),a[0]=1;
for(int i=0;i<=m-1;++i)
for(int j=i;j>=0;--j)
a[j+1]=(a[j+1]+a[j])%mod,a[j]=1ll*(
m-i)*a[j]%mod;
for(int i=1,j=1;i<=len;++i,j=1ll*j
*b%mod)s=(s+1ll*j
*q[i])%mod;
//for(int i=0;i<=m;++i)printf("[%d]",a[i]);puts("");
for(int i=0;i<=m;++i)a[i]=1ll*a[i]*im
%mod;
memset(dp,0,sizeof(dp));
dp[0][0][0]=1;
for(int i=1;i<=len&&i<=m;++i)
for(int j=0;j<=i;++j)
for(int k=0;k<=m;++k)
int ans=0;
for(int i=0,dx=1;i<=m;++i,dx=mod-dx)
for(int j=0;j<=m;++j)r[j]=0;
intx=0,z=0;
//printf("",len);
for(int j=len;j>=2&&x
<=i;--j)if(q[j])
}if(i==x)
nxt:;
//printf("\n[i=%d]\n",i);
//for(int j=0;j<=m;++j)printf("[%d]",r[j]);
for(int j=0;j<=m;++j)sum=(sum+1ll*r[j]*a[j])%mod;
ans=(ans+1ll*sum
*dx)%mod;
if(!add(c-1))break;
s=(1ll*s+c-1+mod)%mod;
}print(ans);
}}
UNR 2 黎明前的巧克力
解題思路 考慮乙個子集 s 的異或和如果為 0 那麼貢獻為 2 不難列出生產函式的式子,這裡的卷積是異或卷積。x 0 prod 2x 1 因為每一項只有兩項 x 0,x 有值,記 f i x 2x 1 f i x textf x 有 f i x sum 1 2 times 1 x s 不難發現 f ...
uoj 310 UNR 2 黎明前的巧克力
題目描述 題解 考慮到選出的兩個集合的異或值為 0 所以我們可以看做找出集合,其異或值為 0 然後如果這個集合大小是 x 對答案的貢獻就是 2 x 所以我們考慮每個 i 對應乙個多項式 1 2x 只要我們把多項式乘起來即可 我們考慮 fwt 過程中 i 位置上的數對 j 位置的貢獻是數值乘上 1 不...
HHUOJ 1092 題面最短的題
題目鏈結 求該公式的值 i 1n j 1m i2j 4i2 ij 4 i 12 sum sum m i 2j 4i 2 ij 4i 12 i 1 n j 1 m i 2j 4 i2 i j 4i 12 由於答案可能過大,所以請輸出答案對 109 7 取模後的結果。輸入包含多組資料,請讀入到檔案末尾結...