题意:
求相加小于等于n的积%p有多少个。
解:
记忆化搜索。 假设已经求出i以及小于i 的答案,存于<set> factor[i]里面,且i + j == n, 则j从0到i,乘以factor[j]里面的东西,就是factor[i]里面存的东西。因为LLwa了很多次。
和这题很像,多校的。 不过这题是求相加小于等于n的质数的最小公倍数的个数。kaka
#include <cstdio>
#include <set>
using namespace std;
int T, n, p;
typedef long long LL;
set <LL> s, factor[77];
void get(){//将相加小于等于n的积放在factor里面
//factor[1].insert(1);
for(int i = 0; i <= 70; i++) factor[i].clear();
for(int i = 1; i <= 70; i ++){
factor[i].insert(i);
for(int j = 1; j < i; j ++){
for(set <LL> :: iterator it = factor[j].begin(); it != factor[j].end(); it ++){
factor[i].insert((i - j) * (LL) (* it));
}
}
}
}
int main(){
get();
scanf("%d",&T);
while( T --){
scanf("%d%d",&n, &p);
s.clear();
for(set <LL> :: iterator it = factor[n].begin(); it != factor[n].end(); it ++){
//printf("%d\n", *it);
s.insert((*it) % p);
}
printf("%d\n", s.size());
}
return 0;
}