爱摸鱼的Dillonh
生活随笔
收集整理的這篇文章主要介紹了
爱摸鱼的Dillonh
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://ac.nowcoder.com/acm/contest/318/E
C++版本一
題解:
這是一個考驗數學思維的題目。
當滿足條件的集合內只有兩個數的時候,要么n=a*a,要么n=a*(a-1),我們可以直接對n進行開根號運算,令cnt1 = ceil(sqrt(n)),cnt2 = floor(sqrt(n)),然后判斷cnt1 *cnt2 是否等于n即可。當滿足條件的集合內有大于等于三個數的時候,我們可以知道n = a * a * a * ... * (a-1)*...*(a-1)。當a取到最大值時,應該滿足n = a * a * a,而n是小于等于1e18的,所以我們可以知道a是小于等于1e6的,所以我們就可以暴力對a進行枚舉了,每次驗證一下是否合法即可。
對于輸出“-1”的情況,也就只有當n=1,或者n=2^k的時候會成立,此時n可以分解為k個2和無數個1相乘的形式,故有無數個集合。最后再按要求處理一下輸出就可以了。
C++版本二?
#include <iostream> #include<stdio.h> #include <string.h> #include<set> #include<bits/stdc++.h> using namespace std; struct node {long long a,b,c,d; }; node s[105]; void init() {for(int i=0;i<105;i++){s[i].a=-1;s[i].b=-1;s[i].c=-1;s[i].d=-1;} } int main() {int t;cin>>t;long long x;for(int cas=1; cas<=t; cas++){int flag=1;init();scanf("%lld",&x);long long yu=x;printf("Case #%d:\n",cas);if((yu&(yu-1))==0)flag=0;for(double i=2.0; i<=68.0; i=i+1.0){long long num=x;long long num1=0,num2=0;long long p=(long long )(pow((double)x,1.0/i));long long q=(long long )(pow((double)x,1.0/i))+1;if(p==1)break;if(q==1)break;while(num%p==0)num/=p,num1++;while(num%q==0)num/=q,num2++;if(num==1){int k=(int)i;s[k].a=(num1);s[k].b=(p);s[k].c=(num2);s[k].d=(q);}}int su=0;int biaoji[1000];memset(biaoji,0,sizeof(biaoji));if(flag){for(int i=0; i<105; i++){if((s[i].a!=-1||s[i].c!=-1)&&biaoji[s[i].a+s[i].c]==0){su++;biaoji[s[i].a+s[i].c]=1;}}}memset(biaoji,0,sizeof(biaoji));if(flag){printf("%d\n",su+1);printf("1 %lld\n",(long long )x);for(int i=0; i<105; i++){if((s[i].a!=-1||s[i].c!=-1)&&biaoji[s[i].a+s[i].c]==0){printf("%lld",s[i].a+s[i].c);biaoji[s[i].a+s[i].c]=1;for(int j=0; j<s[i].a; j++)printf(" %lld",s[i].b);for(int j=0; j<s[i].c; j++)printf(" %lld",s[i].d);printf("\n") ;}}}elseprintf("-1\n");}}?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的爱摸鱼的Dillonh的全部內容,希望文章能夠幫你解決所遇到的問題。