裴蜀定理

裴蜀定理:任意两个数来组合,必定是其gcd的倍数。

推广:如果求n个数的组合结果集,如果这n个数的gcd不为1,则有无穷个数无法被组合。

gcd=1时,两个数最大不能表示的数是(a-1)(b-1)-1;

本题的状态方程和完全背包模板题类似,不过求max变成了 || 。

dp状态表示的是前i类笼子是否能组合出数字 j。

https://www.acwing.com/problem/content/1228/

#include<bits/stdc++.h>
using namespace std;
const int N=110;
bool f[N][10005];
int n;
int w[N];
int gcd(int a ,int b){
    return b ? gcd(b,a%b) : a;
}
int main(){
    int d;
    cin>>n;
 
    for (int i = 1; i <=n; i ++ ) cin>>w[i];
    for(int i=1;i<=n;i++){
        d=gcd(d,w[i]);
    }
    if(d!=1)    {puts("INF");return 0;}
    f[0][0]=true;
    for(int i=1;i<=n;i++){
        for(int j=0;j<10000;j++){
            if(j>=w[i]) f[i][j]=f[i-1][j] || f[i][j-w[i]];
            else f[i][j]=f[i-1][j];
        }
    }
    int ans=0;
    for(int j=0;j<10000;j++){
        if(!f[n][j]) ans++;
    }
    cout<<ans;
      
    return 0;
}
posted @ 2022-02-27 11:21  秋月桐  阅读(86)  评论(0编辑  收藏  举报