zoukankan      html  css  js  c++  java
  • NOIP模拟测试30「return·one·magic」

    magic

    题解

    首先原式指数肯定会爆$long$ $long$

    首先根据欧拉定理我们可以将原式换成$N^{sumlimits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G}^{i}  \%phi(p)}\%p$

    根据欧拉函数是积性的得出$phi(54184622)=phi(2)*phi(27092311)$

    然后$phi(27092311)=27092310$  $phi(2)=1$所以$phi(54184622)=27092310$

    于是我们现在要求的就是$N^{sumlimits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G}^{i}  \%27092310}\%p$

    $27092310=2*3*5*7*129011$然后裸的$crt$求组合数板子求就完了

    注意:你要预处理出阶乘和逆元,否则会超时

    代码

    #include<bits/stdc++.h>
    #define ll long long
    #define A 333333
    ll k,p,n,g;
    //phi(54184622)=27092310
    //27092310=2*3*5*7*129011
    ll w[7]={0,2,3,5,7,129011,54184622},jie[6][A],ni[6][A],dl[A],b[A];
    ll exgcd(ll a,ll b,ll &x,ll &y){
        if(b==0){
            x=1;y=0;
            return a;
        }
        ll gcd=exgcd(b,a%b,x,y);
        ll t=x;
        x=y;
        y=t-a/b*y;
        return gcd;
    }
    ll meng(ll x,ll k,ll cix){
        ll ans=1;
        for(;k;k>>=1,x=x*x%w[cix])
            if(k&1)
                ans=ans*x%w[cix];
        return ans;
    }
    ll china(){
        ll x,y,a=0,m,n=1;
        for(ll i=1;i<=5;i++)
            n*=w[i];
        for(ll i=1;i<=5;i++){
            m=n/w[i];
            exgcd(w[i],m,x,y);
            a=(a+y*m*b[i])%n;
        }
        if(a>0) return a;
        return a+n;
    }
    ll gcd(ll x,ll y){
        if(y==0) return x;
        return gcd(y,x%y);
    }
    ll jic(ll n,ll m,ll cix){
        if(m>n) return 0;
        if(m==0) return 1;
        return jie[cix][n]%w[cix]*ni[cix][n-m]%w[cix]*ni[cix][m]%w[cix];
    }
    ll lucas(ll n,ll m,ll cix){
        if(n==0)return 1;
        return jic(n%w[cix],m%w[cix],cix)*lucas(n/w[cix],m/w[cix],cix)%w[cix];
    }
    using namespace std;
    int main()
    {
        scanf("%lld%lld",&n,&g);    
        for(ll i=1;i<=min(g,n);i++){
            if(gcd(i,n)==1)
                dl[++dl[0]]=i;
        }
        for(ll i=1;i<=5;i++){
            jie[i][0]=1;
            ni[i][0]=1;
            for(ll j=1;j<w[i];j++)
                jie[i][j]=jie[i][j-1]*j%w[i];
            ni[i][w[i]-1]=meng(jie[i][w[i]-1],w[i]-2,i);
            for(ll j=w[i]-2;j>=1;j--)
                ni[i][j]=ni[i][j+1]*(j+1)%w[i];
            for(ll j=1;j<=dl[0];j++)
                (b[i]+=lucas(g,dl[j],i))%=w[i];
        }
        ll j=china();
        ll k=meng(n,j,6);
        cout<<k<<endl;
        //模w「i」 剩余b「i」    
    }
    View Code

    one

    题解

    美妙的约瑟夫问题,

    范围特别大考虑线性推

    然而我懒的说了

    代码特别简单,只是上文稍做修改

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define ll int
    #define A 1000000
    ll ans,t,n;
    int main(){
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            ans=0;
            for(ll i=n-1;i>=0;i--)
                ans=(ans+i)%(n-i+1);
            printf("%d
    ",ans+1);
        }
    }
    View Code

    return

    题解

    这是道语文题,这一定是一个语文题,一定是这样

    其实它是让你求前趋后继

    那么这个题难点就在于怎么在作者给出题干中看出是前趋后继

    那么我们看题干

      

         $0-2^{31}$范围内

     我真的没看出来这是求前趋后继,$pdf$上没给样例解释

  • 相关阅读:
    Ubuntu安装qBittorrent
    资深程序猿冒死揭开软件潜规则:无法维护的代码
    Oracle11g Active Data Guard搭建、管理
    Android 扁平化button
    Eclipse Android 代码自己主动提示功能
    Echoprint系列--编译
    一步步玩pcDuino3--mmc下的bootloader
    【Discuz】去除版权信息,标题栏与底部改动
    phoenixframe自己主动化測试平台对div弹出框(如弹出的div登陆框)的处理
    UVa
  • 原文地址:https://www.cnblogs.com/znsbc-13/p/11401052.html
Copyright © 2011-2022 走看看