#灯塔#2023.10.26#算法补题(2)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

Bingbong给定了一个长度为n的数组a,初始时a1=1,a2=2,......,an=n,现在他需要从0到m中选出一个数来作为an+1。然后通过以下的规则来更新数组a。 规则:ai=(ai+1)% i (i∈n→1) 对于更新后的数组a,Bingbong想使得a数组中不同的元素恰好为k个。由于从[0,m]的挑选方案种数太多,他实在数不过来,所以他想请作为数学高手的你来帮他解决这个问题。

输入描述:

 

第一行一个整数case(case<=10000),表示数据组数。

接下来case行,每行三个非负整数。分别为n,m,k(1<=n<=1e9,0=<m<=1e9,1<=k<=n+1),含义如题面所示。

输出描述:

 

共case行。每行一个非负整数代表最终的方案总数。

示例1

输入

复制4 4 6 3 2 0 1 265 265 265 3 10 2

4
4 6 3
2 0 1
265 265 265
3 10 2

输出

复制2 1 0 5

2
1
0
5

说明

 

对于第一组样例:

我们可以选择an+1=6,然后如下操作

  • a4=a5mod4=6mod4=2

  • a3=a4mod3=2mod3=2

  • a2=a3mod2=2mod2=0

  • a1=a2mod1=0mod1=0

  • a=[0,0,2,2,6]

  • 这样a数组刚好有3个不同的数字。

  • 对于第三组样例,没有一个数字可以选择使得数组a刚好为265个不同的数字。

  • import java.util.*;
    public  class Main {
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            int T = sc.nextInt();
            while (T-->0){
                int n = sc.nextInt();
                int m = sc.nextInt();
                int k = sc.nextInt();
                int count=0;
                if(k==1){
                    System.out.println(1);
                } else if (k==2&&m<=n) {
                    System.out.println(m);
                } else if (k==2&&m>n) {
                    System.out.println(n+m/n-1);
                } else if (k==3&&m>n) {
                    System.out.println(m-n-m/n+1);
                } else if (k==3&&m<=n) {
                    System.out.println(0);
                } else if (k>3||k<1) {
                    System.out.println(0);
                }
    
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值