HDOJ5447Good Numbers(数论)
Posted myx12345
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ5447Good Numbers(数论)相关的知识,希望对你有一定的参考价值。
题意:
思路:From https://blog.csdn.net/qq_36553623/article/details/76683438
大概就是把1e6里面的质因子能除的都除光之后借助两者gcd中有最大质因子的条件分类讨论
其实也就5类,重点是如何设分类的标准,其实唯一的标准就是对答案的贡献
int128本机环境跑不了,只能交上去的时候改,总觉得有朝一日要掉坑里
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef long double ld; 7 typedef pair<int,int> PII; 8 typedef pair<ll,ll> Pll; 9 typedef vector<int> VI; 10 typedef vector<PII> VII; 11 typedef pair<ll,ll>P; 12 #define N 1000000+10 13 #define M 200000+10 14 #define INF 1e9 15 #define fi first 16 #define se second 17 #define MP make_pair 18 #define pb push_back 19 #define pi acos(-1) 20 #define mem(a,b) memset(a,b,sizeof(a)) 21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 23 #define lowbit(x) x&(-x) 24 #define Rand (rand()*(1<<16)+rand()) 25 #define id(x) ((x)<=B?(x):m-n/(x)+1) 26 #define ls p<<1 27 #define rs p<<1|1 28 #define fors(i) for(auto i:e[x]) if(i!=p) 29 30 const int MOD=998244353,inv2=(MOD+1)/2; 31 //int p=1e4+7; 32 double eps=1e-6; 33 int dx[4]={-1,1,0,0}; 34 int dy[4]={0,0,-1,1}; 35 36 int p[N],b[N]; 37 38 int read() 39 { 40 int v=0,f=1; 41 char c=getchar(); 42 while(c<48||57<c) {if(c==‘-‘) f=-1; c=getchar();} 43 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 44 return v*f; 45 } 46 47 ll readll() 48 { 49 ll v=0,f=1; 50 char c=getchar(); 51 while(c<48||57<c) {if(c==‘-‘) f=-1; c=getchar();} 52 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 53 return v*f; 54 } 55 56 template<class T> void Read(T &x) 57 { 58 static int CH; 59 while((CH=getchar())<‘0‘||CH>‘9‘); 60 for(x=CH-‘0‘;(CH=getchar())>=‘0‘&&CH<=‘9‘;x=(x<<3)+(x<<1)+(CH-‘0‘)); 61 } 62 63 int is2(__int128 x) 64 { 65 __int128 t=pow(x,1.0/2)+0.5; 66 if(t*t==x) return 1; 67 return 0; 68 } 69 70 int is3(__int128 x) 71 { 72 __int128 t=pow(x,1.0/3)+0.5; 73 if(t*t*t==x) return 1; 74 return 0; 75 } 76 77 void calc(ll &ans,__int128 x,__int128 y) 78 { 79 if(y==1) 80 { 81 if(x==1) ans*=1; 82 else if(is3(x)) ans*=3; 83 else if(is2(x)) ans*=2; 84 else ans*=1; 85 } 86 else if(y>1&&is2(y)) 87 { 88 if(y%x==0) ans*=3; 89 else ans*=2; 90 } 91 else if(x>1&&is2(x)) 92 { 93 if(x%y==0) ans*=3; 94 else ans*=2; 95 } 96 else if(y%x==0) ans*=2; 97 else ans*=1; 98 } 99 100 int main() 101 { 102 //freopen("1.in","r",stdin); 103 //freopen("1.out","w",stdout); 104 int n=0; 105 rep(i,2,1e6) 106 { 107 if(!b[i]) p[++n]=i; 108 rep(j,1,n) 109 { 110 int t=p[j]*i; 111 if(t>1e6) break; 112 b[t]=1; 113 if(i%p[j]==0) break; 114 } 115 } 116 int cas=read(); 117 while(cas--) 118 { 119 __int128 s1,s2; 120 Read(s1); 121 Read(s2); 122 ll ans1,ans2; 123 ans1=ans2=1; 124 rep(i,1,n) 125 { 126 if(s1%p[i]==0) 127 { 128 int s=0; 129 while(s1%p[i]==0) 130 { 131 s++; 132 s1/=p[i]; 133 } 134 ans1*=s; 135 } 136 if(s2%p[i]==0) 137 { 138 int s=0; 139 while(s2%p[i]==0) 140 { 141 s++; 142 s2/=p[i]; 143 } 144 ans2*=s; 145 } 146 } 147 __int128 k=std::__gcd(s1,s2); 148 calc(ans1,k,s1/k); 149 calc(ans2,k,s2/k); 150 printf("%I64d %I64d ",ans1,ans2); 151 } 152 return 0; 153 }
以上是关于HDOJ5447Good Numbers(数论)的主要内容,如果未能解决你的问题,请参考以下文章
HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)
[HDOJ1492]Happy 2004(数论,快速幂,逆元,积性函数)