嵊州D3T3 light

嵊州D3T3 light

光恰似水

兄弟俩曾经 k 次受到过父母的物质激励。

一开始,兄弟俩的能力值为 1,最后,兄弟俩的能力值是 1 + (2 ^k−1)/ n 。

当兄弟俩受到价值为 mi 的物质的激励时,他们的能力值会变成原来的 1 + 1/ mi 倍。

但是现在,他们已经不记得父母给他们的物质激励的价值是多少了。

请你给出一种任意可行的方案。

Input

第一行一个整数 T,表示数据组数。

对于每组数据,一行两个整数,代表 n, k。

Output

输出共 T 行。

对于每组数据,输出 k 个整数 mi

表示一种可能的答案,或者一个空行。

Examples

light.in  light.out
1 4 3 1 4 10

Notes

对于所有数据,满足 0 ≤ T ≤ 10 , 0 ≤ k ≤ 60 , 1 ≤ n ≤ 10^18。

Subtask1[11pts]

T = 0

Subtask2[20pts]

k = 0

Subtask3[28pts]

T = 1 , n, k ≤ 3

Subtask4[41pts]

无特殊限制


开始没有看懂题目

就先写了个函数模拟

//用函数模拟 
void func(int time,int en){
    if(time>k) return;
    if(time==k&&en==1+((pow(2,k))-1)/(n*1.0f)) return;
    for(m[time]=1;m[time]<=100;m[time]++){
        if(en==1+((pow(2,k))-1)/(n*1.0f)) return;
        else func(time+1,en*(1+m[time]));
    }
    ;
}

然后主函数的话

    int t;
    cin>>t;
    for(int i=0;i<t;i++){
        cin>>n>>k;
        func(1,1);
        for(int j=1;j<=k;j++)
            cout<<m[j]<<" "; 
        cout<<endl;
    }

 

std

其实它是一个递归调用的过程

void work(long long n, long long k)
{
    if (k == 0) {puts(""); return;}//边界条件1: 特殊值 
    if (k == 1) {printf("%lld
", n); return;}//边界条件2:回溯到了第1次 
    
    if (n & 1)//如果n在二进制下末位是一的话(即n为奇数)……这样的话 
    {
        printf("%lld ", n);
        work((n + 1) >> 1, k - 1); //右移n+1一位,舍弃多余的位,相当于(n+1)/2  
    }
    else//否则n为偶数…… 
    {
        printf("%lld ", n - 2 + (1LL << k));
        work(n >> 1, k - 1);//右移n一位,舍弃多余的位,相当于n/2  
    }
}

所以,再加一个主函数内的调用即可

#include <cstdio>

using namespace std;

long long n, k;

int T;

void work(long long n, long long k)
{
    if (k == 0) {puts(""); return;}//边界条件1: 特殊值 
    if (k == 1) {printf("%lld
", n); return;}//边界条件2:回溯到了第1次 
    
    if (n & 1)//如果n(的二进制数)是像1111111111111……这样的话 (在十进制下就是要2^n-1这样的)
    {
        printf("%lld ", n);
        work((n + 1) >> 1, k - 1); //把n+1右移一位,舍弃多余的位(向下取整),相当于int强制转换,但不相当于(n+1)/2(向零取整)  
    }
    else//否则…… 
    {
        printf("%lld ", n - 2 + (1LL << k));
        work(n >> 1, k - 1);//右移n一位,舍弃多余的位,相当于n/2  
    }
}

int main()
{
//    freopen("light.in", "r", stdin);
//    freopen("light.out", "w", stdout);
    
    scanf("%d", &T);
    while (T--)
    {
        scanf("%lld%lld", &n, &k);
        work(n, k);
    }
    return 0;
} 

OK!

 

原文地址:https://www.cnblogs.com/send-off-a-friend/p/11181950.html