实际数

实际数题目 http acm csu edu cn OnlineJudge problem php id 1416 题意 给一个数 其中 判断是不是实际数

大家好,欢迎来到IT知识分享网。

题目:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1416

 

题意:给一个数实际数,其中实际数,判断实际数是不是实际数。实际数的定义如下:

 

     对于一个数实际数,如果区间实际数的每一个数都能用实际数的某些因子的和来表示,那么称实际数实际数,否则不是。

     例如:12是实际数,因为它的所有因子为1,2,3,4,6,而5 = 2 + 3,7 = 3 + 4,8 = 2 + 6,

     9 = 3 + 6,10 = 1 + 3 + 6,11 = 2 + 3 + 6。

 

分析:本题有一个很好的结论。描述如下:

 

     先把实际数素因子分解得到实际数,且实际数实际数为实际数当且仅当实际数且对于2实际数

     间的每一个实际数满足条件

                        实际数

 

代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <bitset> using namespace std; const int N = ; typedef long long LL; bitset<N> prime; int p[N]; int cnt; void isprime() { cnt = 0; prime.set(); for(int i=2; i<N; i++) { if(prime[i]) { p[cnt++] = i; for(int j=i+i; j<N; j+=i) prime[j] = false; } } } bool OK(LL n) { if(n == 1) return 1; if(n % 2) return 0; LL ans = 2; while(n % 2 == 0) { ans *= 2; n >>= 1; } ans--; for(int i=1; i<cnt&&p[i]<=n; i++) { if(n%p[i]==0) { if(p[i] > ans + 1) return 0; LL tmp = p[i]; while(n%p[i]==0) { tmp *= p[i]; n /= p[i]; } tmp--; tmp /= (p[i] - 1); ans *= tmp; if(ans >= n) return 1; } } if(n > ans + 1) return 0; return 1; } int main() { LL n; int T; isprime(); scanf("%d",&T); while(T--) { scanf("%lld",&n); if(OK(n)) puts("Yes"); else puts("No"); } return 0; }

 

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121267.html

(0)
上一篇 2025-10-24 17:33
下一篇 2025-10-24 18:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信