跳蚤
time limit:1000ms
memory limit:10000k
total submissions:8731
accepted:2605
description
z城市居住著很多只跳蚤。在z城市週六生活頻道有乙個娛樂節目。乙隻跳蚤將被請上乙個高空鋼絲的正**。鋼絲很長,可以看作是無限長。節目主持人會給該跳蚤發一張卡片。卡片上寫有n+1個自然數。其中最後乙個是m,而前n個數都不超過m,卡片上允許有相同的數字。跳蚤每次可以從卡片上任意選擇乙個自然數s,然後向左,或向右跳s個單位長度。而他最終的任務是跳到距離他左邊乙個單位長度的地方,並撿起位於那裡的禮物。
比如當n=2,m=18時,持有卡片(10, 15, 18)的跳蚤,就可以完成任務:他可以先向左跳10個單位長度,然後再連向左跳3次,每次15個單位長度,最後再向右連跳3次,每次18個單位長度。而持有卡片(12, 15, 18)的跳蚤,則怎麼也不可能跳到距他左邊乙個單位長度的地方。
當確定n和m後,顯然一共有m^n張不同的卡片。現在的問題是,在這所有的卡片中,有多少張可以完成任務。
input
兩個整數n和m(n <= 15 , m <= 100000000)。
output
可以完成任務的卡片數。
sample input
2 4sample output
12hint
這12張卡片分別是:
(1, 1, 4), (1, 2, 4), (1, 3, 4), (1, 4, 4), (2, 1, 4), (2, 3, 4),
(3, 1, 4), (3, 2, 4), (3, 3, 4), (3, 4, 4), (4, 1, 4), (4, 3, 4)
a1*x1+a2*x2+a3*x3+……+anxn+m*x(n+1)=1
(a1,a2,a3,……,an,m)=1 排除公因子非1的情況 總共的情況數是m^n
a1-an都是小於等於m
初始化出m範圍內所有的素因子 列舉所有範圍內的素因子
例如 有素因子2 所以m內有m/2個數有2這個素因子 有素因子3 所以m內有m/3個數有3這個素因子
所以重複計算了6這個因子 多算了m/6個數 諸如此類。。。
#include #include #include #include #include #include #include #include #include #define mem(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define mod 10009
#define maxn 10010
#define maxm 100010
#define inf 99999999
#define ll long long
#define bug cout<<"here"<9)
prll(a/10);
putchar(a%10+'0');
}ll p[200],tot;
ll ans,tmp;
ll a[200],m,n;
void divide(ll x)
}if(x!=1)
}ll mult(ll a,ll b)
return x;
}void dfs(ll x,ll cnt,ll c)//共有c個公共因子
for(ll i=x+1;i<=tot;i++)
}int main()
ans=mult(m,n)-ans;
printf("%lld\n",ans);
}return 0;
}
POJ1091 跳蚤 容斥
解題報告 設數字分別為a1 a2,a3 m 那麼若方程x1 a1 x 2a2 xn 1m 1有解 則這張卡片可行。而此方程有解的充要條件為gc d a1 a2,a3 m 1 所以本題即為求gc d a1 a2,a3 m 1 1 a 1,a2 a3 an m 的方案數。那麼可以反著求gc d a1 a...
跳蚤 POJ 1091 容斥原理
跳蚤time limit 1000ms memory limit 10000k total submissions 8723 accepted 2601 description z城市居住著很多只跳蚤。在z城市週六生活頻道有乙個娛樂節目。乙隻跳蚤將被請上乙個高空鋼絲的正 鋼絲很長,可以看作是無限長。...
poj1091 跳蚤 容斥原理
思路 假設跳蚤選擇x1個第一張卡片,x2個第二張卡片。xn個第n張卡片,xn 1張寫著m的卡片,那麼就可以列出方程 a1 x1 a2 x2 an xn m x n 1 1 由於可以向左跳和向右跳,因此題目即問上述不定方程是否有解?答案以及它的證明可以在任何一本數論書中找到,它的充要條件是 a1,a2...