日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数学--数论--HDU 2197 本原串 (推规律)

發(fā)布時(shí)間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学--数论--HDU 2197 本原串 (推规律) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由0和1組成的串中,不能表示為由幾個(gè)相同的較小的串連接成的串,稱(chēng)為本原串,有多少個(gè)長(zhǎng)為n(n<=100000000)的本原串?
答案mod2008.
例如,100100不是本原串,因?yàn)樗怯蓛蓚€(gè)100組成,而1101是本原串。
Input
輸入包括多個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)一行,包括一個(gè)整數(shù)n,代表串的長(zhǎng)度。
Output
對(duì)于每個(gè)測(cè)試數(shù)據(jù),輸出一行,代表有多少個(gè)符合要求本原串,答案mod2008.
Sample Input
1
2
3
4
Sample Output
2
2
6
12

解析:
考慮所有串減去非本原串。
長(zhǎng)度為N的串最多組成 2N2^N2N種情況的串,當(dāng)串全部為1或?yàn)?的時(shí)候不是本原串。
再舉個(gè)例子,6的時(shí)候 6可以由三個(gè)長(zhǎng)度為2的串組成,也可以由長(zhǎng)度為3的兩個(gè)穿組成,那么長(zhǎng)度為2的組成方式其實(shí)是有四種00 01 10 11因?yàn)?0 11組成的是全為1的或者,全為0的之前考慮過(guò),所以不重復(fù)計(jì)算。在考慮長(zhǎng)度為3的串,000 001 010 011 100 101 110 111 除了000 111之外還有六種,我們發(fā)現(xiàn)恰好為,其本原串的數(shù)量。
因此此題公式為:

2N?cal[i]其中i為因子,cal()為長(zhǎng)度為i的本原串的數(shù)量2^N-cal[i] 其中i為因子,cal()為長(zhǎng)度為i的本原串的數(shù)量2N?cal[i]ical()長(zhǎng)i數(shù)

故可寫(xiě)出代碼:

#include <cstring> #include <iostream> #include <cstdio> #include <algorithm> #include <map> using namespace std; int m[10000000]; long long n,ans; long long mod_pow(long long x,long long n,int mod) {long long res=1;while(n){if(n&1)res=res*x%mod;x=x*x%mod;n>>=1;}return res; } int cal(long long n) {if(m[n]!=0)return m[n];m[n]=mod_pow(2,n,2008)-2; for(int i=2;i*i<=n;i++){if(n%i==0){m[n]=(m[n]-cal(i)+2008)%2008; if(i*i!=n)m[n]=(m[n]-cal(n/i)+2008)%2008;}}return m[n]; } int main() {m[0]=0;m[1]=2;m[2]=2;while(scanf("%d",&n)!=EOF){if(n<=2)printf("%d\n",m[n]);else{m[n]=cal(n);printf("%d\n",m[n]);}} }

總結(jié)

以上是生活随笔為你收集整理的数学--数论--HDU 2197 本原串 (推规律)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。