题意:给你数n,问你1~n-1中是否有数m,让gcd(n,m)==n^m,如果有就存起来
做法:枚举n的约数,我们会发现 n^约数 = m ,n^m = 约数
解法:暴力就好
#include<iostream> #include<cstdio> #include<string.h> #include<string> #include<set> #include<algorithm> #include<cmath> #include<vector> #define ll __int64 #define lll unsigned long long #define MAX 1000009 using namespace std; ll n; ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); } void solve() { vector<ll>op; for(ll i = 1; i*i<=n; i++)//枚举N的所有约数K { if(n%i==0) { ll m = n^i;//令M = N^K; if(1<=m&&m<=n&&gcd(n,m)==i)//再判断gcd(N,M)是不是等于K。 { op.push_back(m); } if(n/i!=i)//奇数的时候 { ll m = n^(n/i); if(1<=m&&m<=n&&gcd(n,m)==n/i) { op.push_back(m); } } } } sort(op.begin(),op.end()); printf("%d\n",op.size()); for(int i = 0; i<op.size(); i++) { if(i) printf(" "); printf("%I64d",op[i]); } printf("\n"); } int main() { int d = 1; while(~scanf("%I64d",&n)) { printf("Case #%d:\n",d++); solve(); } return 0; }