洛谷P2241:
思路:
正方形个数
边长为1 个数n*m
边长为2 个数(n-1)*(m-1)
边长为3 个数(n-2)*(m-2)
所以 边长为min{n,m} 个数(m-min{n,m}+1)*(n-min{n,m}+1)
长方形加正方形个数
total=(1+2+3+…+n)*(1+2+3+…+m)
=((1+n)*(1+m)*n*m)/4
长方形个数
上面两式相减即可得出
所以思路就是 先算出正方形个数 然后用公式得出长方形和正方形个数总和 最后得到长方形个数
代码:
#include <bits/stdc++.h>
using namespace std;
long long n,m,a,b,sum=0,t,chang;
int main ()
{
cin>>n>>m;
a=n,b=m,sum=n*m,t=0,chang=0;
//zheng:
while(a!=0&&b!=0)
{
a--;
b--;
sum+=a*b;
}
//quan:total=(1+2+3+…+n)*(1+2+3+…+m)=((1+n)*(1+m)*n*m)/4
t=((1+n)*(1+m)*n*m)/4;
//chang
chang=t-sum;
cout<<sum<<" "<<chang;
return 0;
}
洛谷p1706全排列:
#include <bits/stdc++.h>
using namespace std;
int n;
int num[100];
int b[10];//标记数组
void dfs(int t,int j)//t:个数,j:下标
{
if(t==n)
{
for(int i=0;i<n;i++)
{
printf("%5d",num[i]);
}
printf("\n");
return ;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0)
{
num[j]=i;
b[i]=1;//标记i已经使用
dfs(t+1,j+1);
b[i]=0;//标记i未使用
}else continue;
}
}
int main ()
{
scanf("%d",&n);
dfs(0,0);
return 0;
}
洛谷p1157:组合经典
#include <bits/stdc++.h>
using namespace std;
int num[25];
int n,r;
void dfs(int a,int start)//a:个数,start:起始值
{
if(a==r)
{
for(int i=0;i<r;i++)
{
printf("%3d",num[i]);
}
printf("\n");
}
for(int i=start;i<=n;i++)
{
num[a]=i;
dfs(a+1,i+1);//使得num数组元素升序排列,去重
}
}
int main ()
{
scanf("%d%d",&n,&r);
dfs(0,1);
return 0;
}