hdu 3524 Perfect Squares 打表+找规律+快速幂+除法取余

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod=10007;
int pow_mod(int a,int b)
{
    int s=1;
    while(b)
    {
        if(b&1)
            s=(s*a)%mod;
        a=(a*a)%mod;
        b=b>>1;
    }
    return s;
}
int main()
{
    int T,tt=0;
    cin>>T;
    while(T--)
    {
        int n,ans;
        cin>>n;
        if(n&1)ans=(pow_mod(2,n-1)-1)*pow_mod(3,mod-2)%mod+2;
        else ans=(pow_mod(2,n-1)-2)*pow_mod(3,mod-2)%mod+2;
        cout<<"Case #"<<++tt<<": "<<(ans%mod+mod)%mod<<endl;
    }
    return 0;
}
/*
    就是打表+找规律
    得出的结果是f[n]=f[n-2]+2^(n-3),这里的结果间隔2,所以要分奇偶,f[1]=f[2]=2;
    n为偶数,f[n]=(2^(n-1)-2)/3+2;
    n为奇数,f[n]=(2^(n-1)-1)/3+2;
    这里需要解决的只有除法取余:
    1.可以用乘法的逆来解决,当然可知当成定理来用(a/b)%mod=(a*b^(mod-2))%mod,mod为素数
原理是费马小定理:a^(mod-1)%mod=1,又a^0%mod=1,所以a^(-1)=a^(mod-2),推出a/b=a*b^(-1)=a*b^(mod-2)
    2.上面的方法适合b比较大的时候,这里的b=3.很小,可知直接(a/b)%mod=(a%(mod*b)/b)%mod
    
    一开始自己不想推公式,百度别人的,。。被坑了。。
*/


打表:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL __int64
LL mod;
LL vis[1<<21];
int main()
{
    LL i,j,t=0;
    for(i=1;i<=20;i++)
    {
        memset(vis,0,sizeof(vis));
        mod=1<<i;
        t=0;
        for(j=0;j<=(1<<i);j++)
        {
            if(!vis[j*j%mod]){t++;vis[j*j%mod]=1;}
        }
        cout<<t<<endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值