Alex loves numbers.
Alex thinks that a positive integer x is good if and only if [⌋ divides x.
Can you tell him the number of good positive integers which do not exceed n ?
题意:
当一个x满足[⌋能乘除x时,x就是一个好数
问1~n内有多少好数
题解:
推一推规律:
我们用将数分成一块一块
以k=2为例:
[1,3] 向下取整为1,左端点减右端点为2,答案是3
[4,8] 向下取整为2,左端点减右端点为4,答案是3
[9,15] 向下取整为3,左端点减右端点为6,答案是3
....
[36,48] 向下取整为6,左端点减右端点为12,答案是3
其实区间的答案=左端点减右端点/向下取整 +1
这是k等于2的情况,k等于其他可以枚举试试
其实本质就是一个找规律的题
注意:
当k过大时,当k>=30是,我们n即便取最大值,开k次方后还是1,所以此时答案就是n
当k=1时答案也是1
除了试出答案其实是严格的推导过程,我就简单提一下
但提一提
一个十分经典的数学问题[1,n]以内有多少数能被x整除——答案就是⌊⌋
然后利用容斥去推导
区间[a,b]有多少个能被x整除的数:
⌊⌋ - ⌊
⌋
剩下的我也不清楚了。。。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e6+9;
int sum[maxn];
int b[maxn];
typedef long long ll;
ll poww(int a,int b)
{
ll sum=1;
while(b)
{
if(b&1)sum*=a;
a=a*a;
b>>=1;
}
return sum;
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
for(int ii=1;ii<=t;ii++){
memset(sum,0,sizeof(sum));
memset(b,0,sizeof(b));
int n,k;
cin>>n>>k;
if(k==1||k>=31)
{
printf("Case #%d: %lld\n",ii,n);
continue;
}
int len=0;
int pos=0;
ll ans=0;
for(int i=1;i;i++)
{
ll x=poww(i,k);//x
if(x>n)
{
sum[len]=(n-pos);
b[len]=i-1;
break;
}
if(i!=1)
{
sum[len]=(x-1)-pos;
b[len]=i-1;
}
if(i==n)ans++;
len++;
pos=x;
}
for(int i=1;i<=len;i++)
{
ans+=(sum[i]/b[i])+1;
}
printf("Case #%d: %d\n",ii,ans);
}
}
/*
1
3133 29
*/
京公网安备 11010502036488号