Given an increasing sequence of integers a1, a2, a3, . . . , ak, the E-transform produces a sequence of the
same length, b1, b2, b3, . . . , bk such that
• b1 = a1
• for j > 1, bj is the only integer aj−1 < bj ≤ aj, which is divisible byaj − aj−1.
For example, from S = 0,1,4,9,16,25,36,49 one gets E(S) = 0,1,3,5,14,18,33,39.
A sequence S such that E(S) = S is called an eigensequence.
For instance, S = 2,3,4,6,8,12,16,18,20 is an eigensequence.
Given integers a1 and an, how many eigensequences (of any length) start with a1 and end with an?
Input
Input has many data lines, followed by a terminating line. Each line has two integers, a1 and an. If
a1 < n, it’s a data line. Otherwise it’s a terminating line that should not be processed. On each line,
0 ≤ a1 ≤ an ≤ 44. This guarantees that each output fits into 32 bit integer.
Output
For each data line, print a line with a1, an, and x, where x is the number of eigensequences (of any
length) that start with a1 and end with an.
Sample Input
0 3
5 7
2 8
0 0
Sample Output
0 3 3
5 7 1
2 8 12
题意:给你一个递增序列的第一位a1,最后一位an,求有多少个序列满足:以a1为首,an为尾
1、B(1) = A(1)
2、后面每项满足,A(j-1) < B(j) ≤ A(j), 且bj能整除A(j) - A(j-1)。
题解:看题目由于给的a1,an都很小我们设定dp[i][j]以第i位以结尾的方案数,
那么 对于满足上述条件就能转移
//meek
#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include<map>
#include<queue>
using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
#define fi first
#define se second
#define MP make_pair const int N=;
const ll INF = 1ll<<;
const int inf = ;
const int MOD= ; ll dp[N][N],vis[N][N];
int a1,an;
ll dfs(int now,int sum) {
if(vis[now][sum]) return dp[now][sum];
vis[now][sum] = ;
ll& ret = dp[now][sum];
ret = ;
if(sum == an) return ret = ;
for(int i = sum+; i <= an; i++) {
if(i%(i-sum)) continue;
ret += dfs(now+,i);
}
return ret;
}
int main() {
while(~scanf("%d%d",&a1,&an)) {
if(a1 == && an == ) break;
mem(vis);
printf("%d %d %lld\n",a1,an,dfs(a1,a1));
}
return ;
}
代码