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 */