目录
P2415 集合求和
结论:A的所有子集元素之和为s*2^(n-1);
s为所以元素和,n为元素个数;
#include<bits/stdc++.h>
using namespace std;
int n,num;
long long sum;
int main()
{
while(cin>>num)
{
sum+=num;
n++;
}
cout<<(long long)(sum*pow(2,n-1)); //一定要强制类型转换(long long)(……)
//别忘了后面的括号!
return 0;
}
P1143 进制转换
看完这篇就懂了:
二进制,八进制,十进制,十六进制的相互转换【简单易懂】_NO.-LL的博客-CSDN博客
#include<bits/stdc++.h>
using namespace std;
string s;
int a,b;
int wei,sum,num;
int c[10000010];
int main()
{
cin>>a>>s>>b;
for(int i=0;i<s.size();i++)
{
if(s[i]<'A')
{
wei=pow(a,s.size()-1-i); //从大向小取位
wei*=(s[i]-'0');
sum+=wei;
}
else
{
wei=pow(a,s.size()-1-i);
wei*=(s[i]-'A'+10);
sum+=wei;
}
}
//sum为a进制转化为十进制的值
while(sum>0)
{
c[num++]=sum%b; //连除法
sum/=b;
}
for(int i=num-1;i>=0;i--) //对应前面,“从下到上输出”
{
if(c[i]>=10) printf("%c",c[i]+'A'-10); //可能是字符,cout默认数字
else cout<<c[i];
}
return 0;
}
约瑟夫环问题
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int n,k,m;
int main()
{
cin>>n>>k>>m;
for(int i=0;i<n;i++) a.push_back(i);
while(n!=1)
{
k=(k+m-1)%n;
a.erase(a.begin()+k);
n--;
}
cout<<a[0];
return 0;
}
等差数列
第十届蓝桥杯省赛C++B/C组,第十届蓝桥杯省赛JAVAC组
小技巧:求最大公约数直接用函数 __gcd() ;
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N];
int n;
/*int gcd(int a,int b) {
return b ? gcd(b, a % b) : a;
}
*/
int main()
{
scanf("%d",&n);
for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
sort(a,a + n);
int d = 0;
for(int i = 1;i < n;i ++) d = __gcd(d, a[i] - a[i - 1]);
if(!d) printf("%d\n",n);
else printf("%d\n",(a[n - 1] - a[0]) / d + 1);
return 0;
}
质数拆分
55965365465060
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
bool isprime(int n) {//判断素数
if (n < 2)return 0;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0)return 0;
}
return 1;
}
ll f[2020];
int main() {
f[0] = 1;
for (int i = 2; i <= 2019; i++) {
if (isprime(i)) {
for (int j = 2019; j - i >= 0; j--) {
if (f[j - i] != 0)f[j]+=f[j-i];
}
}
}
cout << f[2019] << endl;
return 0;
}
阶乘约数
分解质因数:
举个例子:
180=2^2 *3^2* 5^1=p1^a1*p2^a2*p3^a3(a1=2,a2=2,a3=1)
180的约数个数为(1+2) * (1+2) * (1+1)=18个。
对于100!得就是将1,2,3.......99,100的对应质因子的幂次之和;如拿 i 当pi ,cnt[i]当ai;又如:1,2,3,4,5,6........99,100的质因子 2^(0+1+0+2+0+1.....0,2)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
int cnt[N]; // cnt[i] 存的是质因子 i 的幂次
int main() {
for(int i = 1 ; i <= 100 ; i ++) {
int x = i;
// 质因子分解
for(int j = 2 ; j * j <= x ; j ++) {//求质数公式
if(x % j == 0) {
while(x % j == 0) x /= j , cnt[j] ++ ;
// j是其中一个质因子,++算1..100的次幂和
}
}
if(x > 1) cnt[x] ++ ;//自己本身也是约数
}
long long ans = 1;
for(int i = 1 ; i <= 100 ; i ++) {
if(cnt[i] != 0) ans *= (cnt[i] + 1);
}
cout << ans;
return 0;
}
快速幂
二进制优化:
将b转化为2进制,并用乘法表示
注意要long long 不然会爆!!!
#include<iostream>
using namespace std;
long long qmi(long long a,int b,int p)
{
long long res=1;
while(b)//对b进行二进制化,从低位到高位
{
//如果b的二进制表示的第0位为1,则乘上当前的a
if(b&1) res = res *a %p;
//b右移一位
b>>=1;
//更新a,a依次为a^{2^0},a^{2^1},a^{2^2},....,a^{2^logb}
a=a*a%p;
}
return res;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b,p;
long long res=1;
cin>>a>>b>>p;
res = qmi(a,b,p);
cout<<res<<endl;
}
return 0;
}