CSUSTOJ-哈希的纸团(mid思维)

题目链接:http://acm.csust.edu.cn/problem/4054
博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13941884.html

Description

哈希是一只喜欢叼纸的小猫,他每次都可以叼一团纸回家,纸的体积为 1 1 1,同时,他还可以把家中所有的纸团(可以只有一个纸团)合并成一个纸团,这个纸团的体积为 所 有 纸 团 之 和 乘 上 p 所有纸团之和乘上p p,但是,哈希家中容量有限,最多只能存在 k k k个纸团

现在哈希想让家中所有纸团的体积之和为 n n n,请你告诉他是否有可能.

input

一行三个整数 n , p , k ( 1 ≤ n , k , p ≤ 1 e 18 ) n,p,k(1 \leq n ,k,p\leq 1e18) n,p,k(1n,k,p1e18)

output

如果可以,则输出"Just Do It",否则输出"No way".

Sample Input 1
10 4 3
Sample Output 1
Just Do It

Sample Input 2
11 4 3
Sample Output 2
No way

emmm,这题可能是我验题WA得最惨的一题了。。。思维要缜密

我们开始思考,第一回合拿 k 1 k_1 k1个纸团后乘上 p p p,第二个回合拿 k 2 k_2 k2个纸团后乘以 p p p
那么我们就可以得到一个表达式: ( . . . . ( ( ( k 1 p + k 2 ) p + k 3 ) p + k 4 ) p . . . . . . . + k n ) = n (....(((k_1p+k_2)p+k_3)p+k_4)p.......+k_n)=n (....(((k1p+k2)p+k3)p+k4)p.......+kn)=n
实际上化简出来就是 k 1 p n + k 2 p n − 1 + . . . + k n = n k_1p^n+k_2p^{n-1}+...+k_n=n k1pn+k2pn1+...+kn=n那么实际上就是用p进制来表示n,那么我们肯定要对 p = 1 p=1 p=1的情况处理掉,否则一旦n过于庞大就好T掉,那么我们就开始谨慎的讨论了:对于 p = 1 p=1 p=1的情况,如果k也为1,那么没什么好说的,n必须为1否则就直接GG,一旦k大于1,那么他就可以无限+1,一定会到达n。

接下来我们处理出p进制下的每一位的系数,我们知道第一次有k个位置给你放,也就是说如果 p n p^n pn的系数大于k的话那就直接GG,融合之后一定会有一个纸团来占位,那么之后的所有的的系数都必须小于 等 于 k − 1 等于k-1 k1

以下是AC代码:

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

typedef long long ll;
const int mac=1e3+10;

ll a[mac];

ll qick(ll x,int b)
{
	ll ans=1;
	while (b){
		if (b&1) ans*=x;
		b>>=1;
		x*=x;
	}
	return ans;
}

int main(int argc, char const *argv[])
{
	ll n,p,k;
	cin>>n>>p>>k;
	if (p==1 && k!=1){
		printf("Just Do It\n");
		return 0;
	}
	if (p==1 && k==1) {
		if (n>1) printf("No way\n");
		else printf("Just Do It\n");
		return 0;
	}
	if (n<=k) {printf("Just Do It\n"); return 0;}
	ll nn=n,nb=0;
	while (nn){
		nn/=p;
		nb++;
	}
	nb--;
	for (int i=nb; i>=0; i--){
		ll use=qick(p,i);
		a[i]=n/use;
		n-=a[i]*use;
	}
	int flag=0;
	if (a[nb]>k) {printf("No way\n"); return 0;}
	for (int i=nb-1; i>=0; i--)
		if (a[i]>k-1) {flag=1; break;}
	if (flag) printf("No way\n");
	else printf("Just Do It\n");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值