观察如下数列:
1 3 0 2 -1 1 -2 …
这个数列中后一项总是比前一项增加 2 或者减少 3。
栋栋对这种数列很好奇,他想知道长度为 n nn 和为 s ss 而且后一项总是比前一项增加 a aa 或者减少 b bb 的整数数列可能有多少种呢?
输入格式
输入的第一行包含四个整数 n s a b n\ s\ a\ bn s a b,含义如前面说述。
输出格式
输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 100000007 的余数。
样例输入
4 10 2 3
样例输出
2
样例说明
这两个数列分别是 {2 4 1 3} 和 {7 4 1 -2}。
- #include
- #include
- #include
- using namespace std;
- #define base 100000007
- int n,s,a,b;
- long long sum=0;
- void check(int k)
- {
- double change=s-k;
- double first=change/n;
- if(fmod(first,1)==0)
- {//计算出的第一个数为整数
- sum++;
- sum%=base;
- }
- }
- void calculate(int,int);
-
- int main()
- {
- cin>>n>>s>>a>>b;
- calculate(n-1,0);
- cout<
- return 0;
- }
- void calculate(int layer,int u)
- {//递归出口
- if(layer==0)
- {
- check(u);
- return;
- }
- int addition=layer*a;
- calculate(layer-1,u+addition);
- addition=(-b)*layer;
- calculate(layer-1,u+addition);
- }
动态规划:
- #include
- #include
- #include
- using namespace std;
- #define base 100000007
- long long a,b,n,s;
- const int N=1000010;
- int f[N]={0};
- //f[i][j]表示从(1~n-1)中前i个数中选择使得和为j的种类数
- //f[i][j]=f[i-1][j]+f[i-1][j-i]; f[i][0]=1;
- void create()
- {//参考01背包问题
- f[0]=1;
- for(int i=1;i<=n-1;i++)
- {
- int num=i*(i+1)/2;
- for(int j=num;j>=i;j--)
- {//需要倒序使得f[j-1]为f[i-1][j-1];
- f[j]=(f[j]+f[j-i])%base;
- }
- }
- }
-
- void calculate();
-
- int main()
- {
- cin>>n>>s>>a>>b;
- create();
- calculate();
- return 0;
- }
- void calculate()
- {
- int num=n*(n-1)/2;
- long long sum=0;
- for(int i=0;i<=num;i++)
- {
- long long u=i*a-(num-i)*b;
- long long temp=s-u;
- if(temp%n==0)
- {//n-1个位置取i个位置
- sum=(sum+f[i])%base;
- }
- }
- cout<
- }
-
相关阅读:
linux使用docker实现redis主从复制和哨兵模式
virtualbox 扩展磁盘后在win10 虚拟机看不到新扩展的空间
广州蓝景分享—「web前端素材」使用CSS动画效果(下)
算法通关村第二关|白银|链表反转拓展【持续更新】
JavaSE---逻辑控制
netstat –ano|findstr “port”命令
消息队列Kafka从入门到高级应用
【已解决】PyCharm里的黄色波浪线
怎么样把下载到的补丁集成到Win10 ISO镜像中?
单元测试UnitTest
-
原文地址:https://blog.csdn.net/Xm041206/article/details/136423683