URAL1204. Idempotents(扩展欧几里得)
生活随笔
收集整理的這篇文章主要介紹了
URAL1204. Idempotents(扩展欧几里得)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1204
大體推推 會出來這個式子 x(x-1) = k*n;n = p*q ;x(x-1)%(p*q)==0;
因為p,q都為素數 那也就是說x和x-1中必定包含這兩個數 而且一個里面只能有一個 不然會大于等于N
當上面的k=0時 x=0||x=1 這是固定的?
然后 {x-pi=0; (x-1)-qi = 1}化這一組 就會變成pi-qi=1 這就變成了擴展歐幾里得 必定存在一組解 解出來帶入一下 注意一下負數就可以了 下一組同樣這樣計算
{x-pi=1; (x-1)-qi = 0}
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<cmath> 7 #include<map> 8 using namespace std; 9 #define N 35000 10 #define LL long long 11 int p[N],g; 12 map<int,int>f; 13 void init() 14 { 15 int i,j; 16 for(i = 2; i <= 32000 ; i++) 17 if(!f[i]) 18 { 19 for(j = i+i ; j < N ; j+=i) 20 f[j] = 1; 21 } 22 for(i = 2; i < N ; i++) 23 if(!f[i]) 24 p[++g] = i; 25 } 26 void exgcd(int a,int b,int &x,int &y) 27 { 28 if(b==0) 29 { 30 x=1;y=0; 31 return ; 32 } 33 exgcd(b,a%b,x,y); 34 int t = x; 35 x = y; 36 y = t-a/b*y; 37 } 38 int main() 39 { 40 int k,n,x,y,a,b,i; 41 init(); 42 cin>>k; 43 while(k--) 44 { 45 cin>>n; 46 int tx = sqrt(n*1.0); 47 for(i = 1; i <= g ; i++) 48 { 49 int o = p[i]; 50 if(n%o==0) 51 { 52 a = o; 53 b = n/o; 54 break; 55 } 56 if(o>tx) break; 57 } 58 exgcd(a,b,x,y); 59 int x1 = x<0? a*x+a*b:a*x; 60 exgcd(b,a,x,y); 61 int x2 = x<0? b*x+b*a:b*x; 62 printf("0 1 %d %d\n",min(x1,x2),max(x1,x2)); 63 } 64 return 0; 65 } View Code?
轉載于:https://www.cnblogs.com/shangyu/p/3409227.html
總結
以上是生活随笔為你收集整理的URAL1204. Idempotents(扩展欧几里得)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.28-8.98万元 本田两款摩托价格
- 下一篇: 日产汽车预计全年经营利润5200亿日元