码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3524 Perfect Squares 推公式求逆元

时间:2015-08-31 01:17:07      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:

Perfect Squares

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 501    Accepted Submission(s): 272


Problem Description
A number x is called a perfect square if there exists an integer b 
satisfying x=b^2. There are many beautiful theorems about perfect squares in mathematics. Among which, Pythagoras Theorem is the most famous. It says that if the length of three sides of a right triangle is a, b and c respectively(a < b <c), then a^2 + b^2=c^2. 
In this problem, we also propose an interesting question about perfect squares. For a given n, we want you to calculate the number of different perfect squares mod 2^n. We call such number f(n) for brevity. For example, when n=2, the sequence of {i^2 mod 2^n} is 0, 1, 0, 1, 0……, so f(2)=2. Since f(n) may be quite large, you only need to output f(n) mod 10007.
 

Input
The first line contains a number T<=200, which indicates the number of test case.
Then it follows T lines, each line is a positive number n(0<n<2*10^9).
 

Output
For each test case, output one line containing "Case #x: y", where x is the case number (starting from 1) and y is f(x).
 

Sample Input
2 1 2
 

Sample Output
Case #1: 2 Case #2: 2

告诉一个数字n,求完全平方数摸2^n有多少不同的结果。没有说完全平方数的范围,想的话应该是循环着的,打表看一看,会发现n分奇数偶数时是有规律的。

n为奇数  2+(4^n-1)/3

n为偶数 2+2/3*(4^(n/2-1)-1)

算除法时分子很大,所以要用到逆元,求逆元的可以参看这篇 点击打开链接


#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
typedef long long ll;
const int mod=10007;

using namespace std;

ll fun(ll n,ll m)
{
    ll b=1;
    while(m)
    {
        if(m&1) b=b*n%mod;
        n=n*n%mod;
        m>>=1;
    }
    return b;
}

int main()
{
    int T;
    ll n;

    ll tmp=fun(3,mod-2);

    scanf("%d",&T);
    for(int ca=1;ca<=T;ca++)
    {
        scanf("%lld",&n);

        ll ans;
        if(n%2)
        {
            ll t=(fun(4,n/2)-1)%mod;
            ans=(2+t*tmp%mod)%mod;
        }

        else
        {
            ll t=(fun(4,n/2-1)-1)%mod;
             ans=(2+2*t*tmp%mod)%mod;
        }
        printf("Case #%d: %lld\n",ca,ans);
    }
    return 0;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 3524 Perfect Squares 推公式求逆元

标签:

原文地址:http://blog.csdn.net/wust_zjx/article/details/48113515

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!