数论专题hdu2197

  

    本题题意:求长度为n的本元串的个数,本元串就是无法由几个相同的子串拼接的01串。

    代码如下:

    

#include <iostream>
using namespace std;
typedef long long ll;
const int mod = 2008;
ll pow_(ll a,ll b,ll mod){

    ll sum = 1;

    while(b){

        if(b&1){

            sum = sum * a % mod;

        }

        a = a * a % mod;

        b >>= 1;

    }

    return sum;

}
ll cal(ll n){

    ll sum = 0;

    for(int i=2;i*i<=n;i++){

        if(n % i == 0){

            sum = (sum + cal(i)) % mod;

            if(i*i!=n){

                sum = (cal(n/i) + sum) % mod;

            }    

        }

    }

    return (pow_(2,n,mod) - sum - 2 + 2008) % mod;

}

int main(){

    ll n;

    while(cin >> n){

        if(n == 1){

            cout << 2 << endl;

        }else{

            cout << cal(n) << endl;

        }

    }

    return 0;

}

这道题第一眼看到的感觉就是打表,然而发现10e8太大,打了很久也没打出来,后来就只能直接去求了,好在一看,直接求的复杂度也不是特别高,然后就写了个递归,过了(第一发wa发现是没有特判n=1)。

这节学了个很不错的技巧,可以用i*i代替sqrt(n),还有注意如果测试发现500爆0,只是因为刚好mod了,你并没有错。。

时间: 2024-10-12 15:20:43

数论专题hdu2197的相关文章

数论专题总结

数论专题总结 kuangbin带你飞之数论基础专题已经刷的差不多了,剩下三道一道中国剩余定理一道离散对数还有一道模拟,模拟那道应该是不会去做了,离散对数的那道看了很多题解一直没有理解题目的思路,只能先暂时放放了,中国剩余定理那道是刘汝佳大白书的例题,暂时没思路也只能先放放了,以后有机会再看下大白书,中国剩余定理已经了解了,离散对数的BSBS模版也有了,虽然这两道变形题暂时不会,但是数论专题部分基础已经有一些了,刷该专题的目标已经完成了,下一专题:kmp. 待补充......

ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德

POJ 1061 青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰

数论专题(转)

经过长时间的试验,发现果然学编程还是要学好数学先,数学引发的更加有质的变化,而盲目学各种编程语言也不能获得一种不一样的体验,或者我没掌握到诀窍.另外打算从这学期学的 信安数学基础 学到的庞大的数论体系开刀,上了这课明显体会到彻底自学就是扯蛋. 网上找到这份题目,还不错的赶脚,刷起! 2014-11-11开始刷起,有链接表示KO 博弈论POJ 2234 Matches GamePOJ 2975 NimPOJ 2505 A multiplication gamePOJ 1067 取石子游戏POJ 2

数论专题hdu2582

本题题意:给出公式f(n) = gcd(3) + ... + gcd(n),而gcd(n) = gcd(C(1,n),...,C(n-1,n)),求出f(n)的值. 代码如下: #include <iostream> using namespace std; typedef long long ll; const int Max = 1000000; int prime[Max+1]; ll sum[Max+1]; void Prime(){ int t = 2; ll i; while(t

数论专题测试——幸运数字

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 typedef long long int64; 8 int64 L; 9 int ca; 10 int64 phi(int64 x){ 11 int64 t=x; 12 for (int6

数论专题hdu2104

本题题意:有N个人,一个人从1开始走,每次间隔M-1个人,问他是否能走到所有的点,并回到原点. 代码如下: #include <cstdio> using namespace std; int gcd(int a,int b) { int r; while(b) { r = a % b; a = b; b = r; } return a; } int main(){ int m,n; while(~scanf("%d%d",&m,&n) &&

数论专题测试——逆元

题意:给定n,m,令k=1+sigam(inv(i,n))mod 1000000007.   n,m小于等于10^7. 求k^k^k^k....后一个k是前一个k的指数,  求这个值对m的mod,知道指数循环节,这就是个傻逼题,然而考场就是不知道这个,少了点东西,所以出题人就是个傻逼.... 指数循环节:a^b%c=>a^(b%phi(c)+phi(c))   %c (b>=phi(c)). 这个题b永远无限大,就可以使用,可以考虑预处理出10^7范围内的phi,然后递归,当c==1时,返回0

ACM:数论专题(3)——约瑟夫问题

(p.s: 以前做约瑟夫问题都是用链表模拟,今天发现了一个效率更高的方法,受教了...) 题目描述: 小Hi和小Ho的班级正在进行班长的选举,他们决定通过一种特殊的方式来选择班长. 首先N个候选人围成一个圈,依次编号为0..N-1.然后随机抽选一个数K,并0号候选人开始按从1到K的顺序依次报数,N-1号候选人报数之后,又再次从0开始.当有人报到K时,这个人被淘汰,从圈里出去.下一个人从1开始重新报数. 也就是说每报K个数字,都会淘汰一人.这样经过N-1轮报数之后,圈内就只剩下1个人了,这个人就作

数论专题---除法表达式之高精度运算,扩展欧几里得算法

[题意描述] 给定这样一个表达式:X1/X2/X3/·····/Xk,其中Xi是正整数.除法表达式应到按照从左到右的顺序求和.但在表达式中嵌入括号可以改变计算顺序.输入表达式,判断是否可以通过加括号使得表达式最后的值为整数. [分析] 表达式可以写成E=(X1·X3·····Xk)/X2:(X1一定在分子位置,X2一定在分母位置,其它任意) 问题变为E是否为整数. 对于大数相乘,我们可以采用两种方法避免数据溢出: 1.采用素数的唯一分解定理:存储可能存在素数的个数(如何存储,用一个数组就行) 2