- B - Div Times Mod
- 题意:给出n,k 求 一个 使等式成立的最小正整数x
- 思路 : 令(x%k) = a 则 原式变为 (x-a)/k * a = n 这里 a∈ (1,k)并且为n的因子
- 解出x来得到 x= n*k / a + a 求最小值即可。即 在a的定义域内找一个最靠近 sqrt (n*k)就是最小值。
-
#include<bits/stdc++.h> using namespace std; int n,k,x,a,b,c,ans,ttt=0x3f3f3f3f,ad; int main() { scanf("%d%d",&n,&k); c=sqrt(k*n); for(int i=1; i<k; i++) { if(n%i==0) { if(abs(i-c)<ttt) { ttt=abs(i-c); ad=i; } } } ans=n*k/ad+ad; printf("%d\n",ans); return 0; }
#include<bits/stdc++.h> using namespace std; int n,k,x,a,b,c,ans=0x3f3f3f3f; vector<int>st; int main() { scanf("%d%d",&n,&k); c=sqrt(k*n); for(int i=1; i<k; i++) if(n%i==0)st.push_back(i); a=lower_bound(st.begin(),st.end(),c)-st.begin(); b=upper_bound(st.begin(),st.end(),c)-st.begin(); if(a<st.size()) ans=n*k/st[a]+st[a]; if(b<st.size()) { if(n*k/st[b]+st[b]<ans)ans=n*k/st[b]+st[b]; } if(a==st.size()&&b==st.size())ans=n*k/st[st.size()-1]+st[st.size()-1]; printf("%d\n",ans); return 0; }
B - Div Times Mod-函数最值
最新推荐文章于 2025-02-10 17:11:28 发布