链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
给出一个n,分别求出1-n内的所有数的因子求和的值,并依次输出。
输入描述:
一个n。
输出描述:
n个数,分别代表1-n的每个数的因子和。(1<=n<=10610^6106)
#include<stdio.h>
int main()
{
long long int a[1000006]={0};
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j+=i)
{
a[j]+=i;
}
}
for(int i=1;i<=n;i++)
printf("%lld ",a[i]);
return 0;
}
这个题目关键在于时间复杂度。解决这个方法就是在判断每个数的因子的时候,转变一个想法,不是单独拎出一个个数来,将其因子相加得出因子和,而是数组的某个数代表着它的因子和,然后通过循环,将每个因子数加入进去。
关键算法举例理解:例如n=5,循环第一个因子1,将它加在符合的数的下面(1是所有正整数的因子),循环第二个因子2,二的累加(相当于只要是2 的倍数,那就将2这个因子加入符合的数下面),其他因子同理,这样,就能降下一些时间复杂度。
强调的是,要记得赋初值
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
作为队伍的核心,forever97很受另外两个队友的尊敬。
Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家forever97爱吃的外卖。
如果Trote_w给forever97买了别家的外卖,forever97就会大喊“我不吃我不吃”。
但是forever97又不喜欢连续三天吃一种外卖。
如果Trote_w哪天忘了这件事并且三天给他买了同一家外卖,那么forever97就会把Trote_w的头摁进手机屏幕里。
作为Trote_w的好朋友,你能告诉他连续请forever97吃n天饭,有多少不同的购买方法吗?
输入描述:
多组样例 第一行一个整数T(1<=T<=20)代表测试样例数 接下来t行每行一个整数n,代表Trote_w要请forever97吃n天饭(1<=n<=100000)
输出描述:
输出T个整数代表方案数,由于答案太大,你只需要输出mod 1e9+7 后的答案即可。
#include<stdio.h>
const int mode=1e9+7;
int main()
{
int t;
scanf("%d",&t);
int n;
for(int i=0;i<t;i++)
{
scanf("%d",&n);
long long int a[100006];
a[1]=3;
a[2]=9;
for(int j=3;j<=n;j++)
{
a[j]=(a[j-1]*2+a[j-2]*2)%mode;
}
printf("%d\n",a[n]);
}
return 0;
}
与上次的方块和糖果的填充一样,将其转换成斐波那契数列的方式动态规划的去算,相对不同的一点是,因为是有三家的选择,所以在第一个数的选择是三,第二个数的选择是九,后面的数字要增乘以倍数2。 (记住宏定义mode'的方法)