1.杨辉三角形
2.k倍区间
#include<iostream>
using namespace std;
int n,k;
long long arr[100010];
int cnt[100010];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
arr[i]+=arr[i-1];
}
cnt[0]=1;//当遍历出首个从头开始的为k倍的前缀和时,它不需要模k左端点即可形成模k区间,为满足通解将0作为其模k左端点,故cnt[0] ++
long long res=0;
for(int i=1;i<=n;i++)//遍历右端点
{
res+=cnt[arr[i]%k];//把前i个端点中与i余数相同的点的个数加上
cnt[arr[i]%k]++;//cnt存余数相同的个数
}
cout<<res<<endl;
return 0;
}
3.质数拆分
题目描述:
2019可以被分解成若干个两两不同的素数,请问不同的分解方案有多少种?
注意:分解方案不考虑顺序,如 2 + 2017 = 2019 和 2017 + 2 = 2019 属于同一种方案。
答案:55965365465060
#include <iostream>
using namespace std;
const int N = 2500;
int k = 1;
int st[N], prime[N];
long long f[N][N];
void init()// 埃氏筛法
{
for (int i = 2; i <= 2019; i ++)
{
if(!st[i])
{
prime[k ++] = i;
for (int j = i + i; j <= 2019; j += i) st[j] = true;
}
}
}
int main()
{
init();
f[0][0] = 1;//容量为0时,选0个也是一种方案,注意dp的初始化
for (int i = 1; i < k; i ++)
for (int j = 0; j <= 2019; j ++) //遍历到当前i位置时,总和为j的方案数
{
f[i][j] = f[i - 1][j];
if(j >= prime[i]) f[i][j] += f[i - 1][j - prime[i]];
}
cout << f[k - 1][2019] << endl;
return 0;
}
4. 回路计数
5.李白打酒
题目描述:
话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb
就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
#include<iostream>
using namespace std;
int cnt;
void dfs(int a,int b,int sum,int ans)
{
if(ans==14)
{
if(sum==1) cnt++;
return;
}
if(a<5) dfs(a+1,b,sum*2,ans+1);
if(b<9) dfs(a,b+1,sum-1,ans+1);
}
int main()
{
dfs(0,0,2,0);
cout<<cnt<<endl;
return 0;
}
6. 李白打酒加强版
dfs:
#include<iostream>
using namespace std;
int cnt;
int n,m;
void dfs(int a,int b,int sum,int ans)
{
if(ans==n+m-1)
{
if(sum==1) cnt++;
return;
}
if(a<n) dfs(a+1,b,sum*2,ans+1);
if(b<m-1&&sum!=0) dfs(a,b+1,sum-1,ans+1);//剪一下,没酒时遇花是不合法的
}
int main()
{
cin>>n>>m;
dfs(0,0,2,0);
cout<<cnt<<endl;
return 0;
}
dp:
#include<iostream>
using namespace std;
int n,m;
const int mod=1e9+7;
int f[110][110][110];
int main()
{
cin>>n>>m;
f[0][0][2]=1;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
for(int k=0;k<=m;k++)//酒最多为m
{
if(i&&k%2==0) f[i][j][k]=(f[i][j][k]+f[i-1][j][k/2])%mod;
if(j) f[i][j][k]=(f[i][j][k]+f[i][j-1][k+1])%mod;
}
}
}
cout<<f[n][m-1][1]<<endl;
return 0;
}
7. 货物摆放
答案:2430
#include<iostream>
#include<vector>
using namespace std;
long long n=2021041820210418;
vector<long long> v;
int main()
{
for(int i=1;i<=n/i;i++)//统计出所有因子,然后循环遍历
{
if(n%i==0)
{
v.push_back(i);
v.push_back(n/i);
}
}
int cnt=0;
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v.size();j++)
{
if(n%(v[i]*v[j])==0) cnt++;
}
}
cout<<cnt<<endl;
return 0;
}