【枚举】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, Aug...

f(n)定义为n的十进制表示下所有位的平方和。

问你方程K*f(n)=n在a<=n<=b中的解的个数。

发现f(n)最大不超过2000,可以直接枚举f(n),然后判断K*f(n)的位的平方和是否恰好为f(n)。

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll K,a,b;
int main(){
//	freopen("g.in","r",stdin);
	int ans1=0,ans2=0;
	cin>>K>>a>>b;
	for(ll fn=1;fn<=2000ll;++fn){
		if(fn>(a-1ll)/K){
			break;
		}
		ll N=fn*K;
		ll t=0;
		while(N){
			t+=(N%10ll)*(N%10ll);
			N/=10ll;
		}
		if(t==fn){
			++ans1;
		}
	}
	for(ll fn=1;fn<=2000ll;++fn){
		if(fn>b/K){
			break;
		}
		ll N=fn*K;
		ll t=0;
		while(N){
			t+=(N%10ll)*(N%10ll);
			N/=10ll;
		}
		if(t==fn){
			++ans2;
		}
	}
	printf("%d\n",ans2-ans1);
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7327355.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值