数论专题hdu2197
Posted mtl6906
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论专题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了,你并没有错。。
以上是关于数论专题hdu2197的主要内容,如果未能解决你的问题,请参考以下文章