约数
题目:
求一个数的约数和
分析:
模拟,注意完全平方数的情况
代码:
#include <cstdio>
#include <cmath>
using namespace std;
int n,ans;
int main(){
freopen("bri.in","r",stdin);
freopen("bri.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=sqrt(n);i++){
if (n%i==0) ans+=n/i+i;
}
if ((int)sqrt(n)*sqrt(n)==n) ans-=sqrt(n);
printf("%d",ans);
return 0;
}
比萨
题目:
限制一些原料无法使用,求能制作多少种比萨。
分析
数据很小, n ≤ 20 , 2 n < = 1048576 n≤20,2^n<=1048576 n≤20,2n<=1048576所以暴搜是可以的。关键就是判断,其实也很简单
代码
#include <cstdio>
using namespace std;
int n,m,a[53][53],ans; bool v[21];
bool check(){
for (int i=1;i<=m;i++){
int ans=0;
for (int j=1;j<=a[i][0];j++)
if (v[a[i][j]]) ans++;
if (ans==a[i][0]) return 0;//不能用的原料都用上了。
}
return 1;
}
void dfs(int dep){
if (dep>n) ans++;
else{
v[dep]=1; if (check()) dfs(dep+1);
v[dep]=0; dfs(dep+1);
}
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++){
scanf("%d",&a[i][0]);
for (int j=1;j<=a[i][0];j++)
scanf("%d",&a[i][j]);
}
dfs(1);
printf("%d",ans);
return 0;
}