using System;using System.Linq;using System.Collections.Generic;namespace myjinxin
{publicclassKata{publicintMobius(double n){MobiusFunc mf =newMobiusFunc(n);return(!mf.IsSqrFreeValue(n))?0:(mf.PrimeFactorsCount(n)%2==0)?1:-1;}}publicclassMobiusFunc{double n;publicMobiusFunc(double n){this.n = n;}publicintPrimeFactorsCount(double n){int count =0;for(int b =2; n >1; b++)if(n % b ==0){
count++;while(n % b ==0)
n /= b;}return count;}publicboolIsSqrFreeValue(double n){bool isSquareFree =true;for(double j =2; j <= Math.Ceiling(Math.Sqrt(n)); j++)if(n %(j * j)==0){
isSquareFree =false;break;}return isSquareFree;}}}
答案2:
namespace myjinxin
{using System;using System.Collections;using System.Collections.Generic;publicclassKata{privatestaticBitArray sieve =newBitArray(1000010,true);privatestaticintNextPrime(int prev){int next;if(prev ==2)
next =3;else{int pos = prev;do pos +=2;while(!sieve[pos]);
next = pos;}if(next *2< sieve.Count && sieve[next *2]){for(int i = next *2; i < sieve.Count; i += next)
sieve[i]=false;}return next;}staticKata(){
sieve[0]=false;
sieve[1]=false;}publicintMobius(double d){long n =(long)d;long limit =(long)Math.Sqrt(n);long counts =0;for(int prime =2; prime <= limit && n !=1; prime =NextPrime(prime)){int c =0;while(n % prime ==0){
n /= prime;++c;}if(c >1)return0;if(c >0)
counts += c;}if(n !=1)++counts;return counts %2==0?1:-1;}}}
答案3:
namespace myjinxin
{using System;using System.Linq;publicclassKata{publicintMobius(double n){int p =0;if(n %2==0){
n = n /2;
p++;if(n %2==0)return0;}for(int i =3; i <= Math.Sqrt(n);
i = i +2){if(n % i ==0){
n = n / i;
p++;if(n % i ==0)return0;}}return(p %2==0)?-1:1;}}}
答案4:
namespace myjinxin
{using System;publicclassKata{publicintMobius(double n){int p =0;if(n %2==0){
n = n /2;
p++;if(n %2==0){return0;}}for(int i =3; i <= Math.Sqrt(n); i = i +2){if(n % i ==0){
n = n / i;
p++;if(n % i ==0){return0;}}}return(p %2==0)?-1:1;}}}
答案5:
namespace myjinxin
{using System;publicclassKata{publicboolIsPrime(long m){if(m<=1)returnfalse;if(m==2)returntrue;if(m%2==0)returnfalse;for(long i =3; i<Math.Sqrt(m)+1;i+=2){if(m%i ==0)returnfalse;}returntrue;}publicintMobius(double x){//coding and coding..int count =0;long n =(long)x;if(IsPrime(n))return-1;double sqrt = Math.Sqrt(n);for(long i=1; i<=sqrt;i++){if(n%i !=0)continue;if(IsPrime(i)){
count++;if(n%(i*i)==0)return0;}if(IsPrime(n/i)) count++;}return count%2==0?1:-1;return1;}}}
答案6:
namespace myjinxin
{using System;using System.Collections.Generic;using System.Linq;publicclassKata{publicintMobius(double n1){long n =(long)n1;long initial = n;int res =0;
List<long> primes =newList<long>();
List<long> primeDivisors =newList<long>();
primes.Add(2);int currentPrimeCounter =0;while(n >1){
currentPrimeCounter =0;foreach(var p in primes){while(n % p ==0){
primeDivisors.Add(p);
n = n / p;
currentPrimeCounter++;}if(currentPrimeCounter >1){break;}}if(n ==1|| currentPrimeCounter >1){break;}long nextPrime =GetNextPrime(primes);
primes.Add(nextPrime);}if(currentPrimeCounter <=1){if(primes.Last()== initial){
res =-1;}else{
res = primeDivisors.Count %2==0?1:-1;}}return res;}privatelongGetNextPrime(List<long> primes){long currentMaxNr = primes.Last()+1;long res =-1;while(res <0){foreach(var p in primes){if(currentMaxNr % p ==0){
res =-1;break;}
res = currentMaxNr;}
currentMaxNr++;}return res;}}}
答案7:
namespace myjinxin
{using System;using System.Collections.Generic;publicclassKata{publicintMobius(double n){
List<long> pfactors =newList<long>();long new_num =(long) n;for(long f =2; f * f <= n; f++){if(n %(f * f)==0&&IsPrime(f))return0;if(new_num % f ==0&&IsPrime(f)){
pfactors.Add(f);while(new_num % f ==0) new_num = new_num / f;if(IsPrime(new_num)){
pfactors.Add(new_num);break;}}}return(pfactors.Count !=0&& pfactors.Count %2==0)?1:-1;}publicboolIsPrime(double num){if(num <=3)returntrue;if(num %2==0|| num %3==0)returnfalse;for(int i =5; i * i < num; i +=6){if(num % i ==0|| num %(i +2)==0)returnfalse;}returntrue;}}}
答案8:
namespace myjinxin
{using System;using System.Collections;using System.Collections.Generic;publicclassKata{privatestaticBitArray sieve =newBitArray(1000010,true);privatestaticintNextPrime(int prev){int next;if(prev ==2)
next =3;else{int pos = prev;do pos +=2;while(!sieve[pos]);
next = pos;}if(next * next >=0&& next * next < sieve.Count && sieve[next * next]){for(int i = next * next; i < sieve.Count; i += next)
sieve[i]=false;}return next;}staticKata(){
sieve[0]=false;
sieve[1]=false;}publicintMobius(double d){long n =(long)d;long limit =(long)Math.Sqrt(n);long counts =0;for(int prime =2; prime <= limit && n !=1; prime =NextPrime(prime)){int c =0;while(n % prime ==0){
n /= prime;++c;}if(c >1)return0;if(c >0)
counts += c;}if(n !=1)++counts;return counts %2==0?1:-1;}}}
namespace myjinxin
{using System;using System.Collections.Generic;using System.Linq;publicclassKata{publicintMobius(double n){
IDictionary<int,int> primeFactors =PrimeFactors(n);int numberOfPrimeFactors = primeFactors.Distinct().Count();// just one factor;if(primeFactors.Values.Any(p => p >=2)){return0;}elseif(primeFactors.Keys.Count %2==0){return1;}else{return-1;}}static IDictionary<int,int>PrimeFactors(double n){
Dictionary<int,int> primeFactors =newDictionary<int,int>();for(int b =2; b <= n;){if(n % b ==0){if(primeFactors.ContainsKey(b)){
primeFactors[b]++;}else{
primeFactors.Add(b,1);}
n = n / b;
b =2;}else{
b++;}}return primeFactors;}}}
简单有趣#142:莫比乌斯功能【难度:2级】:答案1:using System;using System.Linq;using System.Collections.Generic;namespace myjinxin{public class Kata{ public int Mobius(double n) { MobiusFunc mf ...