1751:分解因数
总时间限制:
1000ms
内存限制:
65536kB
描述
给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * ... * an,并且1 < a1 <= a2 <= a3 <= ... <= an,问这样的分解的种数有多少。注意到a = a也是一种分解。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 < a < 32768)
输出
n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数
样例输入
2 2 20
样例输出
1 4
#include <bits/stdc++.h>
using namespace std;
int f(int a,int b){
if(a == 1){
return 1;
}
if(b == 1){
return 0;
}
if(a % b != 0){
return f(a,b - 1);
}
return f(a / b,b) + f(a,b - 1);
//return f(a - 1,b);
//return
}
int main(){
int n;
scanf("%d",&n);
for(int i = 0;i <n;i++){
int s;
scanf("%d",&s);
printf("%d\n",f(s,s));
}
return 0;
}
此题思路:如果可以被整除,则执行1.向下寻找下一个可以被整除的值 2.对这个除数进行操作
如果不能被整除,则执行:向下寻找可以被整除的值
错因:写着写着就忘了a,b各自的身份--思路要清晰啊
仍待解决
6262:流感传染
总时间限制:
1000ms
内存限制:
65536kB
描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
样例输入
5 ....# .#.@. .#@.. #.... ..... 4
样例输出
16
本人代码
#include <bits/stdc++.h>
using namespace std;
char a[101][101];
void input(int n){
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cin >> a[i][j];
}
}
}
int t = 0;
int ans = 0;
int f(int x,int y,int k,int n){
t++;
for(int i = x;i <= n;i++){
for(int j = y;j <= n;j++){
if(a[i][j] == '@'){
if(i == 1&&j == 1){
for(int p = i;p <= i + 1;p++){
for(int q = j;q <= j + 1;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}else if(i == n&&j == 1){
for(int p = i - 1;p <= i;p++){
for(int q = j;q <= j + 1;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}
else if(i == n&&j == n){
for(int p = i - 1;p <= i;p++){
for(int q = j - 1;q <= j;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}
else if(i == 1&&j == n){
for(int p = i;p <= i + 1;p++){
for(int q = j - 1;q <= j;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}else if(i == 1){
for(int p = i;p <= i + 1;p++){
for(int q = j - 1;q <= j + 1;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}
else if(i == n){
for(int p = i - 1;p <= i;p++){
for(int q = j - 1;q <= j + 1;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}else if(j == 1){
for(int p = i - 1;p <= i + 1;p++){
for(int q = j;q <= j + 1;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}else if(j == n){
for(int p = i - 1;p <= i + 1;p++){
for(int q = j - 1;q <= j;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}else{
for(int p = i - 1;p <= i + 1;p++){
for(int q = j - 1;q <= j + 1;q++){
if(a[p][q] != '#'){
a[p][q] = '@';
}
}
}
}
}
}
}
if(t == k + 1){
return ans;
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(a[i][j] == '@'){
//ans++;
f(i,j,k,n);
}
}
}
}
int main(){
int n;
cin >> n;
input(n);
int k;
cin >> k;
cout << f(1,1,k,n);
return 0;
}
PS:fbnq2我为啥超时呢
1760:菲波那契数列(2)
总时间限制:
1000ms
内存限制:
65536kB
描述
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。 给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
样例输入
4 5 2 19 1
样例输出
5 1 181 1
#include <bits/stdc++.h>
using namespace std;
int f[10001];
int main(){
int x;
cin >> x;
f[1] = 1;f[2] = 1;
for(int i = 0;i < x;i++){
int a;
cin >> a;
for(int j = 3;j <= a;j++){
f[j] = f[j - 1]%1000 + f[j - 2]%1000;
f[j]%=1000;
}
printf("%d\n",f[a]);
}
return 0;
}
结果
只需把第3行改成
int f[1000001];
就可以AC了
所以数组大小一定要看题
9273:PKU2506Tiling
总时间限制:
2000ms
单个测试点时间限制:
1000ms
内存限制:
131072kB
描述
对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。
下图是一个2行17列的走道的某种铺法。
输入
整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250
输出
如题
样例输入
2 8 12 100 200
样例输出
3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251
未AC原因:while(cin >> a)