题目描述:
给你一个正整数 n
,开始时,它放在桌面上。在 109
天内,每天都要执行下述步骤:
- 对于出现在桌面上的每个数字
x
,找出符合1 <= i <= n
且满足x % i == 1
的所有数字i
。 - 然后,将这些数字放在桌面上。
返回在 109
天之后,出现在桌面上的 不同 整数的数目。
示例 1:
输入:n = 5 输出:4 解释:最开始,5 在桌面上。 第二天,2 和 4 也出现在桌面上,因为 5 % 2 == 1 且 5 % 4 == 1 。 再过一天 3 也出现在桌面上,因为 4 % 3 == 1 。 在十亿天结束时,桌面上的不同数字有 2 、3 、4 、5 。
示例 2:
输入:n = 3 输出:2 解释: 因为 3 % 2 == 1 ,2 也出现在桌面上。 在十亿天结束时,桌面上的不同数字只有两个:2 和 3 。
解法1:
将每天的可能性完全模拟出来,时间复杂度为O(n3)
int distinctIntegers(int n) {
int dp[n+1];
dp[n]=1;
for(int i=0;i<n;i++)//设最多运行n天
{
for(int j=1;j<=n;j++)//将每一个小于等于n的正整数作为x
{
if(dp[j]==0)//如果是n的倍数则跳过
continue;
for(int k=1;k<=n;k++)//将每一个小于等于n的正整数作为i
{
if(j%k==1)//符合要求则使数列对应位置置1
dp[k]=1;
}
}
}
int sum=0;
for(int i=1;i<=n;i++)//将所有置1位加起来
{
if(dp[i]==1)
sum+=dp[i];
}
return sum;
}
解法2:
运用数学方法,应为n%(n-1)==1;符合要求,所以在条件天数后,桌上数应为(n-1)个,
当n==1时除外。
int distinctIntegers(int n) {
return n==1?1:(n-1);
}