标签:
1 3 10 3 52 4 0 0
1 4 13
求置换群循环节的lcm
注意lcm(x1..xn)=lcm(x1,lcm(x2..xn)!=x1*..*xn/gcd
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (x<<1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (2139062143) #define F (100000007) #define MAXN (1000000) typedef long long ll; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} char s[]="no solution\n"; class Math { public: ll gcd(ll a,ll b){if (!b) return a;return gcd(b,a%b);} ll abs(ll x){if (x>=0) return x;return -x;} ll exgcd(ll a,ll b,ll &x, ll &y) { if (!b) {x=1,y=0;return a;} ll g=exgcd(b,a%b,x,y); ll t=x;x=y;y=t-a/b*y; return g; } ll pow2(ll a,int b,ll p) { if (b==0) return 1; if (b==1) return a; ll c=pow2(a,b/2,p); c=c*c%p; if (b&1) c=c*a%p; return c; } ll Modp(ll a,ll b,ll p) { ll x,y; ll g=exgcd(a,p,x,y),d; if (b%g) {return -1;} d=b/g;x*=d,y*=d; x=(x+abs(x)/p*p+p)%p; return x; } int h[MAXN]; ll hnum[MAXN]; int hash(ll x) { int i=x%MAXN; while (h[i]&&hnum[i]!=x) i=(i+1)%MAXN; hnum[i]=x; return i; } ll babystep(ll a,ll b,int p) { MEM(h) MEM(hnum) int m=sqrt(p);while (m*m<p) m++; ll res=b,ans=-1; ll uni=pow2(a,m,p); if (!uni) if (!b) ans=1;else ans=-1; //特判 else { Rep(i,m+1) { int t=hash(res); h[t]=i+1; res=(res*a)%p; } res=uni; For(i,m+1) { int t=hash(res); if (h[t]) {ans=i*m-(h[t]-1);break;}else hnum[t]=0; res=res*uni%p; } } return ans; } }S; int a[10000+10]; bool b[10000+10]; int p[10000+10]; int main() { // freopen("C.in","r",stdin); // freopen(".out","w",stdout); int n,k; while(cin>>n>>k) { if (n+k==0) return 0; int s=0; For(j,k) for(int i=n/k*k+j>n?n/k*k+j-k:n/k*k+j;i>=1;i-=k) a[++s]=i; // For(i,n) cout<<a[i]<<' '; int tot=0; MEM(b) For(i,n) { if (!b[i]) { int t=i; b[i]=1; int len=1; do { b[t]=1; t=a[t]; ++len; // cout<<t<<endl; } while (!b[t]); len--; p[++tot]=len; } } sort(p+1,p+1+tot); tot=unique(p+1,p+1+tot)-(p+1); // For(i,tot) cout<<p[i]<<' '; ll ans=1; For(i,tot) ans=ans/S.gcd(p[i],ans)*p[i]; cout<<ans<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 4259(Double Dealing-lcm(x1..xn)=lcm(x1,lcm(x2..xn))
标签:
原文地址:http://blog.csdn.net/nike0good/article/details/47448319