virtual hust 2013.6.21 NEFU 挑战编程----数论 F - Smith Numbers
思路: 从当前数字开始往上暴力,找到合数之后质因式分解,看是否满足那个关系。

#include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <cstdio> using namespace std; #define maxn 40000 bool vis[maxn]; int n_prime=0; int prime[maxn/8]; int cnt[maxn/8]; void Prime() { memset(vis,true,sizeof(vis)); vis[0]=vis[1]=0; for(int i=2;i<maxn;i++) if(vis[i]) { prime[++n_prime]=i; for(int j=2*i;j<maxn;j+=i) vis[j]=false; } //cout<<n_prime<<":"<<prime[n_prime]<<endl; } bool is_prime(int n) { if(n<maxn) return vis[n]; for(int i=1;i<=n_prime;i++) { if(n%prime[i]==0) return false; } return true; } int digit_sum(int n) { int ans=0; while(n) { ans+=n%10; n/=10; } return ans; } int main() { Prime(); int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int ans=n+1; while(1) { if(is_prime(ans)) { ans++; } else { int tmp=digit_sum(ans); memset(cnt,0,sizeof(cnt)); int tnt=ans; int pnt=0; for(int i=1;i<=n_prime;i++) { if(tnt<prime[i]) break; while(tnt%prime[i]==0) { cnt[i]++; tnt/=prime[i]; } pnt+=cnt[i]*digit_sum(prime[i]); } if(tnt!=1) pnt+=digit_sum(tnt); if(pnt==tmp) { printf("%d\n",ans); break; } ans++; } } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步