zoukankan      html  css  js  c++  java
  • P1593 因子和

    P1593 因子和
    新算法:
    #define ni 逆元
    先质因数分解,
    (1+p1^1+p1^2...p1^x)*(1+p2^1+p2^2...p2^x)
    然后套等比数列公式就可以了。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<queue>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<ctime>
      7 #include<set>
      8 #define mod 9901
      9 #include<cstring>
     10 #define inf long long_MAX
     11 #define For(i,a,b) for(register long long i=a;i<=b;i++)
     12 #define p(a) putchar(a)
     13 #define g() getchar()
     14 //by war
     15 //2017.10.27
     16 using namespace std;
     17 long long num,b;
     18 struct node
     19 {
     20     long long cnt;
     21     long long p;
     22 }a[10000];//40M
     23 long long prime[10000];//40M
     24 long long cnt;
     25 long long tot;
     26 bool vis[10000];
     27 long long ans;
     28 
     29 void in(long long &x)
     30 {
     31     long long y=1;
     32     char c=g();x=0;
     33     while(c<'0'||c>'9')
     34     {
     35     if(c=='-')
     36     y=-1;
     37     c=g();
     38     }
     39     while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
     40     x*=y;
     41 }
     42 void o(long long x)
     43 {
     44     if(x<0)
     45     {
     46         p('-');
     47         x=-x;
     48     }
     49     if(x>9)o(x/10);
     50     p(x%10+'0');
     51 }
     52 
     53 void Euler(long long x)
     54 {
     55     For(i,2,x)
     56     {
     57         if(!vis[i])prime[++cnt]=i;
     58         for(register long long j=1;j<=cnt&&prime[j]*i<=x;j++)
     59         {
     60             vis[prime[j]*i]=true;
     61             if(i%prime[j]==0)
     62             break;
     63         }
     64     }
     65 }
     66 
     67 void resolve(long long x)
     68 {
     69     For(i,1,cnt)
     70     {
     71         if(x%prime[i]==0)
     72         {
     73             a[++tot].p=prime[i];
     74             while(x%prime[i]==0)
     75             {
     76             a[tot].cnt++;
     77             x/=prime[i];
     78             }
     79         }
     80     }
     81     if(x>1)
     82     {
     83     a[++tot].p=x;
     84     a[tot].cnt++;    
     85     }
     86 }
     87 
     88 long long ksm(long long a,long long b)
     89 {
     90     if(b==0)
     91     return 1;
     92     while(b%2==0)
     93     {
     94         a=(a*a)%mod;
     95         b>>=1;
     96     }
     97     long long r=1;
     98     while(b>0)
     99     {
    100         if(b%2==1)
    101         r=(r*a)%mod;
    102         a=(a*a)%mod;
    103         b>>=1;
    104     }
    105     return r%mod;
    106 }
    107 
    108 void exgcd(long long a,long long b,long long &x,long long &y)
    109 {
    110     if(!b)
    111     {
    112         x=1;
    113         y=0;
    114         return;
    115     }
    116     exgcd(b,a%b,x,y);
    117     long long temp=x;
    118     x=y;
    119     y=temp-(a/b)*y;
    120 }
    121 
    122 long long series(long long q,long long n)
    123 {
    124     long long fz=ksm(q,n)-1;
    125     long long x,y,b;
    126     exgcd(q-1,mod,x,y);
    127     long long ni=x;
    128     ni=(ni%mod+mod)%mod;
    129     return (fz*ni%mod+mod)%mod;
    130 }
    131 
    132 int main()
    133 {
    134     in(num),in(b);
    135     Euler(sqrt(num));
    136     resolve(num);
    137     ans=1;
    138     For(i,1,tot)
    139     ans=ans*series(a[i].p,a[i].cnt*b+1)%mod;
    140     o(ans%mod);
    141     return 0;
    142 }
  • 相关阅读:
    C++ 函数模板&类模板详解
    C++ const修饰不同类型的用法
    C++ 引用Lib和Dll的方法总结
    C#查询本机所有打印机
    C#如何设置桌面背景
    C#使用Aspose.Words把 word转成图片
    查看IP占用
    查看IP占用
    C# Dictionary判断Key是否存在
    C# 只有小时和分钟的两个时间进行对比
  • 原文地址:https://www.cnblogs.com/war1111/p/7744925.html
Copyright © 2011-2022 走看看