• 快速模幂,大数模小数


    https://ac.nowcoder.com/acm/contest/330/E

    链接:https://ac.nowcoder.com/acm/contest/330/E
    来源:牛客网
     

    精通程序设计的 Applese 叕写了一个游戏。


    在这个游戏中,有一个 n 行 m 列的方阵。现在它要为这个方阵涂上黑白两种颜色。规定左右相邻两格的颜色不能相同。请你帮它统计一下有多少种涂色的方法。由于答案很大,你需要将答案对 109+7109+7 取模。

    输入描述:

    仅一行两个正整数 n, m,表示方阵的大小。

    输出描述:

    输出一个正整数,表示方案数对 10^9+7 取模。

    示例1

    输入

    复制

    1 1

    输出

    复制

    2

    示例2

    输入

    复制

    2 2

    输出

    复制

    4
    

    由题意知所求的只是2^n mod 1000000007即可

    根据数论知识有A^B mod P = A ^  ( euler(P) + B mod euler(P) )  mod P 即可

    由此可以避免掉使用高精度的麻烦。

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    typedef long long ll;
    const int mod=1000000007;
    int c;
    char str[100005];
    void quick_mod(ll n){
        ll a=2,k=1;
        while(n){
            if(n%2==1){
                k=k*a;
                k%=mod;
            }
            a=a*a%mod;
            n/=2;
        }
        cout<<(k*2)%mod<<endl;
    }
    void euler(int n){ //返回euler(n)
         int res=n,a=n;
         for(int i=2;i*i<=a;i++){
             if(a%i==0){
                 res=res/i*(i-1);
                 while(a%i==0) a/=i;
             }
         }
         if(a>1) res=res/a*(a-1);
         c=res;
    }
    char sss[100005];
    int main()
    {
        euler(mod);
            ll b=0;
            scanf("%s%s",str,sss);
            int len=strlen(str);
            for(int i=len-1;i>=0;i--){
                if(str[i]=='0'){
                    str[i]='9';
                }
                else{
                    str[i]=(char)((int)(str[i])-1);
                    break;
                }
            }
            for(int i=0;i<len;i++){
                b=b*10+str[i]-'0';
                if(b>c)
                    b=b%c;
            }
            quick_mod(b+c);
        return 0;
    }

    或:

    #include<bits/stdc++.h>
    using namespace std;
    char x1[200005];char x2[200005];
    typedef long long ll;
    ll pow(ll x,ll n,ll mod)
    {
        ll res=1;
    	while(n>0)
    	{
    	   if(n%2==1)
    	   {
    	   	 res=res*x;
    	   	 res=res%mod;
    	   }
    	   x=x*x;
    	   x=x%mod;
    	   n>>=1;
    	}
    	return res;
    }
    ll n,m;
    const ll P=1000000007;
    ll f(char s[])
    {
        int len=strlen(s);
        ll tmp=1;
        ll res=0;
        for(int i=len-1;i>=0;i--)
        {
            res=(res+((s[i]-'0')*tmp%(P-1)))%(P-1);
            tmp=(tmp*10)%(P-1);
        }
        return res;
    }
    int main()
    {
        scanf("%s%s",x1,x2);
        n=f(x1);
        ll ans=pow(2,n+1000000006,P);
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    php类型运算符
    今天我开始写自己的东西
    挑选简历
    SQL Server和Oracle数据库索引介绍
    排序算法分析与设计实验
    软件框架 转
    【转】Ajax的原理和应用
    Web Service
    [转]异地分布式敏捷软件开发(Distributed Agile Software Development)
    [转]如何有效的使用C#读取文件
  • 原文地址:https://www.cnblogs.com/linruier/p/10344718.html
Copyright © 2020-2023  润新知