题解 | #简单的整除#

简单的整除

https://ac.nowcoder.com/acm/contest/59284/A

E题题解,希望大家能开心做题!

#include<bits/stdc++.h>
using namespace std;

const int N =1e6+10;
int a[N],h[N],ans[N];
int n,m,k,b;

int main()
{
    int t;cin>>t;
    while(t--)
    {
        memset(ans,0,sizeof(ans)); //初始化答案数组
        cin>>n>>m>>k>>b;
        for(int i=1;i<=n;i++) cin>>h[i]; //输入初始高度
        
        for(int i=1;i<=n;i++) 
        {
            cin>>a[i];                //输入每次操作的高度
            int mid=(k-h[i])/a[i]+1;       //找到规律与不规律的临界点
            if(m<=mid)                      //不规律的上面部分
            {
                ans[i]=h[i]+a[i]*(m-1);
            }else                            //规律的下半部分
            {
                int mm=m-mid;                //除去不规律的,剩余规律的个数
                int y=(k-b)/a[i]+1;           //一个规律循环的个数
                if(y==1) ans[i]=b;            //y==1说明规律只有1种,不断重复一个数字
                else
                {
                    mm%=y;                    //通过取余找到所在规律的第几个数
                    if(!mm) mm=y;            //刚好为最后一个值,那就是y
                    ans[i]=b+a[i]*(mm-1);       
                }
            }
        }
        for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
        cout<<endl;
    }
    return 0;
}
全部评论

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务